在相机视图中偏移3D对象

时间:2012-11-28 06:06:58

标签: c# .net 3d xna-4.0

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

我成功创建了我的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));

因为枪支世界矩阵被完全定位,如果它被冻结到没有旋转的轴......这可能有助于也可能没有帮助。有什么想法吗?

2 个答案:

答案 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。它让我走上了正确的轨道。