我正在使用Jogl中的现代OpenGL(3.3+)重写我的应用程序。
我正在使用所有常规矩阵,即objectToWorld,WorldToCamera和CameraToClip(或模型,视图和投影)
我创建了一个用于处理所有鼠标移动的类,正如McKesson在“学习现代3D图形编程”中所做的那样,使用一种方法来偏移相机目标位置
private void offsetTargetPosition(MouseEvent mouseEvent){
Mat4 currMat = calcMatrix();
Quat orientation = currMat.toQuaternion();
Quat invOrientation = orientation.conjugate();
Vec2 current = new Vec2(mouseEvent.getX(), mouseEvent.getY());
Vec2 diff = current.minus(startDragMouseLoc);
Vec3 worldOffset = invOrientation.mult(new Vec3(-diff.x*10, diff.y*10, 0.0f));
currView.setTargetPos(currView.getTargetPos().plus(worldOffset));
startDragMouseLoc = current;
}
calcMatrix()返回相机矩阵,其余部分应清晰
我想要的是移动我的物体和鼠标,现在鼠标移动和物体转换不对应,即它们不是线性的,因为我正在处理不同的空间我猜...
我了解到如果我想在空间O中应用变换T,但在空间C中相关,我应该使用p作为顶点执行以下操作
C *(C * T * C ^ -1)* O * p
我应该做类似的事吗?
答案 0 :(得分:0)
我用一个该死的简单比例解决了......
float x = (float) (10000 * 2 * EC_Main.viewer.getAspect() * diff.x / EC_Main.viewer.getWidth());
float y = (float) (10000 * 2 * diff.y / EC_Main.viewer.getHeight());
Vec3 worldOffset = invOrientation.mult(new Vec3(-x, y, 0.0f));
考虑我的投影矩阵
Mat4 orthographicMatrix = Jglm.orthographic(-10000.0f * (float) EC_Main.viewer.getAspect(), 10000.0f * (float) EC_Main.viewer.getAspect(),
-10000.0f, 10000.0f, -10000.0f, 10000.0f);