这很简单,只需两件事。
- 鼠标移动事件的事件处理程序。
- 代表基本模型视图转换的摄影机对象
样本事件代码
这是一些用于事件处理的示例源代码。系统模块(处理所有游戏<->浏览器交互)跟踪两个变量:lastMousePosition
和lastMouseDelta
。
要用鼠标跟踪摄像机,您只需要lastMouseDelta
知道如何逐帧旋转多少度即可。
var canvas = /* WebGL rendering context */
canvas.onmousedown = function (event) { me.handleMouseDown(event); };
canvas.onmouseup = function (event) { me.handleMouseUp(event); };
canvas.onmousemove = function (event) { me.handleMouseMove(event); };
// snip
engine.SystemModule.prototype.handleMouseMove = function(event) {
this.lastMouseDelta = [event.clientX - this.lastMousePosition[0],
event.clientY - this.lastMousePosition[1]];
this.lastMousePosition = [event.clientX, event.clientY];
};
相同的相机移动代码
这是一些用于处理相机旋转的示例代码。给定鼠标在X或Y方向上移动的像素数,将相机旋转那么多度。
/**
* degrees/pixel
* @const
*/
var cameraMouseRotation = 0.5;
// Mouse movement for camera angle.
if (sys.isMouseDown()) {
var positionChange = sys.getLastMousePositionDelta();
camera.rotateYDegs(cameraMouseRotation * positionChange[0]);
camera.rotateXDegs(-cameraMouseRotation * positionChange[1]);
}
稍后,当您实际渲染世界时,只需从相机生成模型视图矩阵即可。(将相机的位置,偏航,俯仰和横滚转换为向量,您可以将其传递给gluLookAt。)并且您应该一切顺利。