2

我是新来的。在根据相机的视角渲染模型的最后一点(这是一个词吗?)时,我遇到了一些麻烦。

我已经成功地创建了我的 3D 相机,能够在 3D 空间中旋转它,并移动/旋转我的枪模型以与相机的移动/旋转相对应。

然而,最后一部分,我无法弄清楚。我试图在相机的旋转轴上偏移枪模型的位置,但找不到任何关于如何做到这一点的信息。

这是我到目前为止的代码,没有我想要的偏移量。

GunWorldMatrix = Matrix.CreateScale(0.5f) * 
    CameraRotation * 
    Matrix.CreateTranslation(CameraPosition); 

可以这么说,它最终将枪“放在我的头上”。完美地定位和旋转模型,但我不知道如何根据它自己的轴或相机的轴添加任何偏移量。(因此您可以将其置于臀部射击位置等)

虽然,这;

Matrix view = Matrix.CreateLookAt(new Vector3(0, 2, 0), new Vector3(0, 0, 0), Vector3.UnitY);

作为观点,有了这个;

GunWorldMatrix = Matrix.CreateScale(0.5f) *
    Matrix.CreateRotationX(-0.15f) *
    Matrix.CreateTranslation(new Vector3(0.2f, 1.65f, 0f));

因为如果 Guns World Matrix 被冻结在没有旋转的轴上,它就会完美定位……这可能有帮助,也可能没有帮助。有任何想法吗?

4

2 回答 2

0

viewMatrix(对相机建模),由三个正交向量组成:
X=[xx,xy,xz], Y=[yx,yy,yz], Z=[zx,zy,zz] 加上相机位置 T=[tx ,ty,tz]

[xx yx zx   tx]   --> order is [0 4      ]             [ 0 1  2 ]
[xy yy zy   ty]                [1 5      ]  -> R^-1 =  [ 4 5  6 ]
[xz yz zz   tz]                [2 ...    ]             [ 8 9 10 ]
[0  0  0     1]                [3      15]             

这里通常 Y 向量代表Up, X 是正确的, Z 是要查看的位置 - 所有都归一化为长度 1。

您只需要关心左上角的 3x3 旋转矩阵,它是逆 R^-1,对于归一化的旋转矩阵,它通常是转置:R^-1 = R'。

要在“屏幕”右侧移动某些东西,您将添加到 object.t_vector += camera^(-1).x_vector。这也可以通过距离、FoV 和纵横比进行缩放,以将对象恰好向右移动 1 个像素或与屏幕尺寸成比例。

注意:这是视图矩阵的 openGL 约定,其中向量是列向量,矩阵按列-行顺序排列。其他系统可以按行列顺序表示或存储矩阵。

于 2012-11-28T06:39:01.630 回答
0

感谢另一个论坛上的一个人,他想出了这个;

float verticalOffset = 1.65f;  
float longitudinalOffset = 0f;  
float lateralOffset = .2f;  

GunWorldMatrix = Matrix.Invert(view); // GunWorldMatrix is now a world space version of the camera's Matrix with position & orientation of the camera  
Vector3 camPosition = GunWorldMatrix.Translation;// note position of camera so when setting gun position, we have a starting point.  

GunWorldMatrix *= Matrix.CreateFromAxisAngle(GunWorldMatrix.Up, 0.15f); // gives the gun that slight angle to point towards target while laterally offset a bit  

Vector3 gunPositionOffsets = (GunWorldMatrix.Up * verticalOffset) +  
                                (GunWorldMatrix.Forward * longitudinalOffset) +  
                                (GunWorldMatrix.Right * lateralOffset);  

GunWorldMatrix.Translation = camPosition + gunPositionOffsets; 

这给了我我的答案。不过,谢谢你的回答,Aki。它使我走上了正确的道路。

于 2012-11-28T18:07:18.463 回答