gpt4 book ai didi

delphi - OpenGL:帮助进行相机变换

转载 作者:行者123 更新时间:2023-12-01 23:49:23 25 4
gpt4 key购买 nike

按照 OpenGL SuperBible 中给出的描述,我正在尝试在 Delphi/OpenGL 中实现相机模型。相机有一个位置、一个向前向量和一个向上向量。平移相机似乎工作正常,但是当我尝试根据前向矢量旋转相机时,我看不到我的物体。

function TCamera.GetCameraOrientation: TMatrix4f;
var
x, z: T3DVector;
begin
z := T3DVector.Create(-FForward.X, -FForward.y, -FForward.z);
x := T3DVector.Cross(z, FUp);

result[0, 0] := x.X;
result[1, 0] := x.Y;
result[2, 0] := x.Z;
result[3, 0] := 0;

result[0, 1] := FUp.X;
result[1, 1] := FUp.Y;
result[2, 1] := FUp.Z;
result[3, 1] := 0;

result[0, 2] := z.x;
result[1, 2] := z.y;
result[2, 2] := z.z;
result[3, 2] := 0;

result[0, 3] := 0;
result[1, 3] := 0;
result[2, 3] := 0;
result[3, 3] := 1;
end;

procedure TCamera.ApplyTransformation;
var
cameraOrient: TMatrix4f;
a, b, c: TMatrix4f;
begin
cameraOrient := getcameraOrientation;
glMultMatrixf(@cameraOrient);
glTranslatef(-FPosition.x, -FPosition.y, -FPosition.z);
end;

给定位置 (0, 0, -15)、前向向量 (0 0 1) 和向上向量 (0 1 0),我期望从 getCameraOrientation 方法获得单位矩阵,但我得到

(1, 0,  0, 0)
(0, 1, 0, 0)
(0, 0, -1, 0)
(0, 0, 0, 1)

如果我将前向向量更改为 (0 0 -1),我会得到以下矩阵:

(-1, 0, 0, 0)
( 0, 1, 0, 0)
( 0, 0, 1, 0)
( 0, 0, 0, 1)

调用 glMultMatrix( ) 和 glTranslate( ) 后,glGet( ) 给出以下 GL_MODELVIEW_MATRIX:

( 1, 0,  0, 0)
( 0, 1, 0, 0)
( 0, 0, -1, 0)
( 0, 0, 15, 1)

我本来希望 15 位于第 4 列第 3 行,而不是第 3 列第 4 行。

谁能看出我哪里错了?

编辑:OpenGL SuperBible 的原始代码:

    inline void GetCameraOrientation(M3DMatrix44f m)
{
M3DVector3f x, z;

// Make rotation matrix
// Z vector is reversed
z[0] = -vForward[0];
z[1] = -vForward[1];
z[2] = -vForward[2];

// X vector = Y cross Z
m3dCrossProduct(x, vUp, z);

// Matrix has no translation information and is
// transposed.... (rows instead of columns)
#define M(row,col) m[col*4+row]
M(0, 0) = x[0];
M(0, 1) = x[1];
M(0, 2) = x[2];
M(0, 3) = 0.0;
M(1, 0) = vUp[0];
M(1, 1) = vUp[1];
M(1, 2) = vUp[2];
M(1, 3) = 0.0;
M(2, 0) = z[0];
M(2, 1) = z[1];
M(2, 2) = z[2];
M(2, 3) = 0.0;
M(3, 0) = 0.0;
M(3, 1) = 0.0;
M(3, 2) = 0.0;
M(3, 3) = 1.0;
#undef M
}

inline void ApplyCameraTransform(bool bRotOnly = false)
{
M3DMatrix44f m;

GetCameraOrientation(m);

// Camera Transform
glMultMatrixf(m);

// If Rotation only, then do not do the translation
if(!bRotOnly)
glTranslatef(-vOrigin[0], -vOrigin[1], -vOrigin[2]);
}

最佳答案

鉴于您的 getcameraOrientation 代码,所得矩阵非常明显:forward = (0, 0, 1) 产生 z = (0, 0, -1),它对应于矩阵的第三行。 z = (0, 0, -1) 和 FUp = (0, 1, 0) 的叉积得到 x = (1, 0, 0),它对应于矩阵的第一行。第二行只是 FUp 的副本,第四行只是固定的。

我实际上不明白你想要实现什么,但是当你旋转相机时,你显然看不到你的物体。在现实世界中,如果你看着一个点并转动你的头 - 这是同样的事情。您是否尝试过颠倒平移和旋转的顺序?

关于delphi - OpenGL:帮助进行相机变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com