【发布时间】:2016-05-22 03:53:25
【问题描述】:
目的
我正在使用 Java AWT 实现多边形旋转。
我已经能够在屏幕上绘制多边形,我想在我的多边形坐标上手动应用一个旋转矩阵(围绕用户的lookAt点进行旋转)。
我已经做了什么
为了旋转世界,用户首先点击屏幕,然后拖动鼠标来执行旋转。
让我们将第一个点击点记为 S,将拖动事件的下一个点记为 L,将屏幕中心记为 C。
为了计算旋转角度,在第一次点击屏幕的时候,我保留了一个从C到S的向量:C-S。
然后,当拖动事件发生时,我计算从 C 到 L 的向量:C-L。 然后我计算 C-S 到 C-L 之间的弧度角度,这就是我在我的世界中应用的角度。
这很好用,多边形确实围绕着lookAt点旋转。
我的问题
当用户完成 PI 的旋转,然后多边形向后旋转时,就会出现问题。
例如当用户开始旋转时,角度从 0.1.. 0.2... 1.. 2.. 3.. 开始,值 ~3.1(我假设 PI),值开始下降:3.. . 2.. 1.. 直到 0,反之亦然。
这是有道理的,因为弧度范围是 [0, PI]。
我假设基向量 C-S 位于 X 轴的右侧,当旋转低于 X 轴时,多边形向后旋转。
但是,我不知道如何让多边形始终沿同一方向旋转(当用户围绕多边形执行完整旋转时)。
编辑
角度函数为:
public final double angle(Vector2D v1)
{
double vDot = this.dot(v1) / ( this.length()*v1.length() );
if( vDot < -1.0) vDot = -1.0;
if( vDot > 1.0) vDot = 1.0;
return ((double) (Math.acos( vDot )));
}
【问题讨论】:
-
您是否可能使用反余弦来计算角度?然后切换到 atan2 方法。
-
"这是有道理的,因为弧度范围是 [0, PI]。" 不,it's [0, 2Pi]。
-
什么意思?编辑和添加角度功能。
-
@LutzL 您的评论已解决此问题,请将其作为答案发布,以便我批准。
标签: java opengl math graphics 3d