背景
getTransformationMatrix()
返回一个
Matrix4f
,然后将其传递到实体着色器中。
问题
模型需要指向摄影机的方向,并围绕摄影机旋转,使其始终位于前方。这种情况下的物体是手持枪的手,如下图所示。
我知道基本的三角学,所以我让物体分别正确地旋转俯仰和偏航。这是我当前的实现:
偏航
@Override
public Matrix4f getTransformationMatrix() {
modelX = getPosition().x + (radius * (float)Math.sin(Math.toRadians(getYaw())));
modelZ = getPosition().z + (radius * (float)Math.cos(Math.toRadians(getYaw())));
return Transform.createTransformationMatrix(new Vector3f(modelX, getPosition().y - 5, modelZ), new Vector3f(0, getYaw(), 0), getScale());
}
抛
@Override
public Matrix4f getTransformationMatrix() {
modelZ = getPosition().z + (radius * (float)Math.sin(Math.toRadians(getPitch())));
modelY = (getPosition().y - 5) + (radius * (float)Math.cos(Math.toRadians(getPitch())));
return Transform.createTransformationMatrix(new Vector3f(getPosition().x, modelY, modelZ), new Vector3f(getPitch(), 0, 0), getScale());
}
我做了一些研究,但我担心我在这方面停留太久了,需要一些新的眼光。当我尝试结合这两种计算时,当查看除0以外的任何偏航角时,模型似乎以图形的形式移动。以下是我尝试将这些结合起来:
@Override
public Matrix4f getTransformationMatrix() {
float zAxis = (radius * (float)Math.sin(Math.toRadians(getPitch())));
modelY = (getPosition().y - 5) + (radius * (float)Math.cos(Math.toRadians(getPitch())));
modelZ = getPosition().z + (zAxis * (float)Math.cos(Math.toRadians(getYaw())));
modelX = getPosition().x + (radius * (float)Math.sin(Math.toRadians(getYaw())));
return Transform.createTransformationMatrix(new Vector3f(modelX, modelY, modelZ), new Vector3f(getPitch(), getYaw(), 0), getScale());
}
这个
Transform.createTransformationMatrix()
如下所示:
public static Matrix4f createTransformationMatrix(Vector3f translation, Vector3f rotation, Vector3f scale) {
transform3d = new Matrix4f();
transform3d.setIdentity();
Matrix4f.translate(translation, transform3d, transform3d);
Matrix4f.rotate((float) Math.toRadians(rotation.x), new Vector3f(1, 0, 0), transform3d, transform3d);
Matrix4f.rotate((float) Math.toRadians(rotation.y), new Vector3f(0, 1, 0), transform3d, transform3d);
Matrix4f.rotate((float) Math.toRadians(rotation.z), new Vector3f(0, 0, 1), transform3d, transform3d);
Matrix4f.scale(scale, transform3d, transform3d);
return transform3d;
}
一位朋友建议创建一个指向上方向的单位向量。
new Vector3f(0, 1, 0)
)通过俯仰和偏航旋转矢量,然后将矢量乘以半径并将其添加到相机的位置。我试过了,但我不知道如何将向量旋转一个角度,而且似乎没有
Vector3f.rotate()