SharpGL/OpenGL 用鼠标旋转对象时,怎么计算水平视角和仰角
时间: 2025-01-04 21:40:01 浏览: 4
在SharpGL或OpenGL中,当你想通过鼠标操作来旋转3D对象时,通常会涉及到两个关键的角度变化:水平视角(Yaw)和仰角(Pitch)。这两个角度的变化会影响相机观察到的对象的视图。
1. **水平视角**(Yaw): 这对应于你在水平面上转动头部,类似于向左或向右看。假设你有一个正对屏幕中心的“前”向量(通常是(0,0,-1)),当用户点击并拖动鼠标时,可以这样做:
- 首先,获取鼠标的新位置和旧位置。
- 计算鼠标移动的方向与垂直方向之间的夹角(注意:这可能是负值)。
- 然后更新“前”向量,使其围绕鼠标移动方向的正交轴旋转相应的角度(通常是弧度制)。
2. **仰角**(Pitch): 这是向上或向下看的角度变化,类似抬头或低头。它会影响到相机的向上或向下倾斜。
- 同样,你需要当前和上一次的鼠标位置,计算垂直偏移。
- 对于仰角,你可以应用相反的操作,因为向上就是减去角度,向下则是加上角度,确保你的角度范围正常(例如,-90度到+90度之间)。
以下是基本的伪代码示例:
```csharp
// 假设MouseDeltaX 和 MouseDeltaY 分别是鼠标在x和y坐标上的变化
Vector3 mouseDirection = new Vector3(MouseDeltaX, 0, MouseDeltaY);
float yawAngle = mouseDirection.AngleTo(Vector3.Up); // 或者使用弧度制计算
float pitchAngle = -(mousePosition.Y - oldPosition.Y); // 注意负数是因为向下是正角度
Matrix4x4 modelRotation = Matrix4x4.CreateFromAxisAngle(Vector3.UnitY, -yawAngle);
modelRotation *= Matrix4x4.CreateFromAxisAngle(Vector3.Right, pitchAngle);
// 应用这个模型旋转到你的对象上
yourObject.Transform *= modelRotation;
```
记得每次旋转都要保存好旧的状态,以便在需要的时候恢复到原始视角。
阅读全文