我是新来的。我在最后一点渲染我的模型时遇到了一些麻烦(这是一个字吗?)到我相机的视角。
我成功创建了我的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));
因为枪支世界矩阵被完全定位,如果它被冻结到没有旋转的轴......这可能有助于也可能没有帮助。有什么想法吗?
答案 0 :(得分: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表示 lookAt - 所有都标准化为长度1。 / p>
你只需要关注左上3x3旋转矩阵和它的反R ^ -1,对于归一化旋转矩阵,它通常是转置:R ^ -1 = R'。
在"屏幕上移动一些东西"好吧,你将添加到object.t_vector + = camera ^( - 1).x_vector。这也可以通过距离,FoV和纵横比进行缩放,以将对象正好或与屏幕尺寸成比例地移动1个像素。
注意:这是视图矩阵的openGL约定,其中向量是列向量,矩阵按列顺序排列。其他系统可以按行列顺序表示或存储矩阵。
答案 1 :(得分: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。它让我走上了正确的轨道。