OpenGL学习笔记 第二周:摄像机操作

OpenGL中如何设置摄像机

  • 在OpenGL中设置camera只需要下面的API即可
    • 前三个是camera的position,可以理解为眼睛的位置,变量命名很贴切。
    • 中间三个是视点的位置,可以理解为你看着那里
    • 后面三个是摄像机的Y轴向量
    • 实际上center-pos产生的向量是作用于x、z两个轴,因此这9个变量就决定了摄像机的位置和朝向。
1
2
3
4
5
6
7
8
9
10
void APIENTRY gluLookAt (
GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz);

屏幕鼠标移动对照到摄像机旋转

  • 首先需要知道屏幕坐标系的正方向是朝向右和下的。
  • angleRotateUp指的是绕Y轴,angleRotateRight指的是绕X轴。
  • 程序实现目标是向右移动鼠标,摄像机右转,反正左转;向下移动数据摄像机向下看,反之向上看。
  • 对于x轴来说,向右移动鼠标得到的deltaX是正数;右手坐标系中Y轴正方向是逆时针的,向右旋转是Y轴顺时针转动,传递给API的角度是应该是个负数,所以此处有了-angleRotateUp。
  • 同理,向下移动得到的deltaY是正数,而X轴正方向是逆时针,而“低头”这个操作在右手坐标系是顺时针旋转,传递给API的角度是复数,所以就有了-angleRotateRight。
  • 数学中,角度x无穷小时,x = sin(x),三角函数里面d/r = sin(x),在归一化中半径R=1,因此就有了x=d,也就是说鼠标移动距离无穷小时,可以认为移动的距离就等于旋转的度数。
  • 理解了上面几点点,就很好做了。

image

开始旋转

image

  • 图中矩阵是一个矢量绕任意轴,旋转任意角度的公式,其中 C = cos(angle),S = sin(angle), AX\AY\AZ是旋转轴的矢量。

  • 公式的代码实现为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   / 向前的矢量
Vector3f viewDirection = mViewCenter - mPos;
Vector3f newDirection(0.0f, 0.0f, 0.0f);
float C = cos(angle);
float S = sin(angle);

// newDirection为旋转后的矢量的值
Vector3f tempX(C + x * x*(1 - C), x*y*(1 - C) - z * S, x*z*(1 - C) + y * S);
newDirection.x = tempX * viewDirection;

Vector3f tempY(x*y*(1 - C) + z * S, C + y * y*(1 - C), y*z*(1 - C) - x * S);
newDirection.y = tempY * viewDirection;

Vector3f tempZ(x*z*(1 - C) - y * S, y*z*(1 - C) + x * S, C + z * z*(1 - C));
newDirection.z = tempZ * viewDirection;

// 此处,新矢量就是当前mViewCenter-mPos后的值,因此新的mViewCenter = mPos + newDirection。
// 想象一下viewDirection就是空间中摄像机位置与视点之间的一个段线,然后绕轴旋转,它的长度是不变的。
// 因此最终这个线段的两端仍旧是视点(新的)和摄像机位置
mViewCenter = mPos + newDirection;

资料

image

# OpenGL
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×