我如何使用arcball让用户查看屏幕?

如何应用arcball(使用四元数)以及鼠标事件,以便用户使用o3d WebGL框架来查看屏幕?

本示例使用arcball旋转“对象”的变换,但不是将其应用于变换,而是将旋转应用于相机的目标,以创建第一人称风格来查看场景,如如果相机在弧形球的中心而不是从外面旋转。

本示例中使用的代码是

var rotationQuat = g_aball.drag([ex, ey]); var rot_mat = g_quaternions.quaternionToRotation(rotationQuat); g_thisRot = g_math.matrix4.mul(g_lastRot, rot_mat); 

我正在使用的代码不起作用

 var rotationQuat = g_aball.drag([ex, ey]); var rot_mat = g_quaternions.quaternionToRotation(rotationQuat); g_thisRot = g_math.matrix4.mul(g_lastRot, rot_mat); var cameraRotationMatrix4 = g_math.matrix4.lookAt( g_eye, g_target, [g_up[0], g_up[1] * -1, g_up[2]] ); var cameraRotation = g_math.matrix4.setUpper3x3( cameraRotationMatrix4, g_thisRot ); g_target = g_math.addVector(cameraRotation, g_target); 

我哪里错了?

如果不知道它是如何“不起作用”的话,这有点难以说出来。 我会说规范的弧球方法包括将2D屏幕位置投影到围绕对象的假想球体的表面上,并且可能过于复杂,因为您需要为相机旋转。

这听起来像是你将能够摆脱之前的鼠标位置和新的(在屏幕空间,拖动过程中)建立一个最短弧四元数 ,并使用该四元数来修改您的视图matrix。

我同意乔希皮特里的答案,使用射线投射find一个假想的球体相交,现在find从第一个鼠标位置的交点到球体的中心的vector,现在重复下一个鼠标位置的步骤,你将有两个向量,交叉产品find你应该旋转你的相机周围的轴。