我刚刚在libgdx中实现了一个arcball cam
private void rotate(float pitch, float yaw, float roll) {
tempQuat.setEulerAngles(pitch, yaw, roll);
rotationQuat.mulLeft(tempQuat);
}
...
float aspect = camera.viewportWidth / camera.viewportHeight;
camera.projection.setToProjection(Math.abs(camera.near), Math.abs(camera.far), camera.fieldOfView, aspect);
camera.view.setToLookAt(camera.position, tempVector.set(camera.position).add(camera.direction), camera.up);
rotate(MyGestureListener.mXAngle, MyGestureListener.mYAngle, 0);
camera.view.rotate(rotationQuat);
camera.combined.set(camera.projection);
Matrix4.mul(camera.combined.val, camera.view.val);
camera.invProjectionView.set(camera.combined);
Matrix4.inv(camera.invProjectionView.val);
camera.frustum.update(camera.invProjectionView);
一切正常,但有一点不好:
我有一些贴纸总是旋转到相机作为广告牌:
p.decalPoint.setPosition(p.pos.x, p.pos.y, p.pos.z);
p.decalPoint.setRotation(camera.direction, camera.up);
现在这已经破了。为什么?我该如何解决这个问题?
我需要一个像这里的弧形相机:
上面的代码效果很好,但广告牌不能使用凸轮。
答案 0 :(得分:1)
您绕过相机并手动更新矩阵和平截头体成员,但忘记更新其他成员。因此,您还必须更新其他成员(例如position
,direction
和up
),或者使用相机提供的功能:
camera.projection.setToProjection
。camera.view.setToLookAt
。camera.view.rotate
的来电是camera.rotate
。camera.combined.set
和Matrix4.mul
。camera.invProjectionView.set
和Matrix4.inv
。camera.frustum.update
。camera.update();
有关详细信息,另请参阅http://www.badlogicgames.com/wordpress/?p=1550。
答案 1 :(得分:0)
我最终使用了两个旋转矩阵和一个camfocusvector作为一个弧形球
四元数不适合此