我在3D空间中有一个Ball,它具有以下属性:
location - 表示球的位置的Vector3f rotation - 表示x,y和z轴旋转角度的Vector3f
我想在一个由Vector3f“方向”表示的特定方向上滚动球。如何根据我希望球滚向的方向计算合适的轴旋转矢量(见上文)?
我尝试了以下内容:
将球的变换矩阵计算为:
private Matrix4f calculateEntityMatrix(EEntity entity)
{
Matrix4f matrix = new Matrix4f();
matrix.translate(new Vector3f(entity.getXLocation(), entity.getYLocation(), entity.getZLocation()));
if(entity.getXRotation()>0)
{
matrix = matrix.rotate(entity.getXRotation(), new Vector3f(1f, 0f, 0f));
}
if(entity.getYRotation()>0)
{
matrix = matrix.rotate(entity.getYRotation(), new Vector3f(0f, 1f, 0f));
}
if(entity.getZRotation()>0)
{
matrix = matrix.rotate(entity.getZRotation(), new Vector3f(0f, 0f, 1f));
}
if(entity.getXScale()!=1 || entity.getYScale()!=1 || entity.getZScale()!=1)
{
matrix = matrix.scale(new Vector3f(entity.getXScale(), entity.getYScale(), entity.getZScale()));
}
return matrix;
}
当向下滚动x轴或z轴时这是有效的,但是当我在两个轴之间的方向上滚动时,旋转看起来不正确。我的假设是,这是由于旋转计算如下:
有关如何更改此行为以便每个轮换彼此独立计算的任何建议吗?
答案 0 :(得分:0)
除非你想实现滑动和/或后旋,否则我认为你应该稍微改变这个问题。您已经有Matrix.rotate()
支持围绕任意轴旋转,使用它。
为球存储的属性
注意:在面向矩阵的系统/场景图中,bould通常存储在单个4x4变换矩阵中。这可能会或可能不会更方便,具体取决于您当前代码库的其余部分。
移动的算法
根据球direction
和标准向上向量(0, 1, 0)
,使用叉积计算rotation axis
。 (即它对于方向和向上轴都是垂直的)
旋转现在只是一个matrix.rotate( rotationSpeed, rotationAxis)
,应用于现有的旋转矩阵。
如果允许球向上/向下滚动表面,请用适当的表面法线替换标准向上矢量。