有一个D3DXMATRIX matProj;的4X4投影矩阵。
我想让这个三维向量只与4X4矩阵的左上角的3X3矩阵相乘。
1、用D3DX提供的现成函数,能实现吗?
2、在VERTEX SHADER中HLSL能实现吗?
谢谢
3 个解决方案
#1
哪里一定要三维向量只与4X4矩阵的左上角的3X3矩阵相乘吗?
一般在 shader里都是这样写的,mul (float4(vPos, matProj));
一般在 shader里都是这样写的,mul (float4(vPos, matProj));
#2
shader里可以支持大矩阵转换为小矩阵,比如
(float3x3)M, M为float4x4的矩阵。
如果dx不能这样转换,可以自己转换,取出4x4矩阵中的左上3x3元素生成一个新矩阵即可。或者把3维向量用4维齐次坐标来表示
(float3x3)M, M为float4x4的矩阵。
如果dx不能这样转换,可以自己转换,取出4x4矩阵中的左上3x3元素生成一个新矩阵即可。或者把3维向量用4维齐次坐标来表示
#3
向量乘矩阵得一个向量。DX里是有这个函数,真正做计算的4x4个也只有4个,有一个一直保持为1。
平移、缩放、旋转。用到的变量都不一样。
希望能为你提供帮助
相关函数:
平移:
D3DXMATRIX *D3DXMatrixTranslation(
D3DXMATRIX* pOut,//返回的结果
FLOAT x, //X轴上的平移量
FLOAT y, //Y轴上的平移量
FLOAT z) //Z轴上的平移量
绕X轴旋转:
D3DXMATRIX *D3DXMatrixRotationX(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Y轴旋转:
D3DXMATRIX *D3DXMatrixRotationY(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Z轴旋转:
D3DXMATRIX *D3DXMatrixRotationZ(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕指定轴旋转:
D3DXMATRIX *D3DXMatrixRotationAxis(
D3DXMATRIX *pOut,//返回的结果
CONST D3DXVECTOR3 *pV,//指定轴的向量
FLOAT Angle//旋转的弧度
);
缩放:
D3DXMATRIX *D3DXMatrixScaling(
D3DXMATRIX* pOut, //返回的结果
FLOAT sx, //X轴上缩放的量
FLOAT sy, //Y轴上缩放的量
FLOAT sz //Z轴上缩放的量
);
//变换向量随矩阵。
D3DXVECTOR3 * D3DXVec3TransformCoord(
D3DXVECTOR3 * pOut,//输出向量
CONST D3DXVECTOR3 * pV,//输入向量
CONST D3DXMATRIX * pM//输入矩阵
);
平移、缩放、旋转。用到的变量都不一样。
希望能为你提供帮助
相关函数:
平移:
D3DXMATRIX *D3DXMatrixTranslation(
D3DXMATRIX* pOut,//返回的结果
FLOAT x, //X轴上的平移量
FLOAT y, //Y轴上的平移量
FLOAT z) //Z轴上的平移量
绕X轴旋转:
D3DXMATRIX *D3DXMatrixRotationX(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Y轴旋转:
D3DXMATRIX *D3DXMatrixRotationY(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Z轴旋转:
D3DXMATRIX *D3DXMatrixRotationZ(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕指定轴旋转:
D3DXMATRIX *D3DXMatrixRotationAxis(
D3DXMATRIX *pOut,//返回的结果
CONST D3DXVECTOR3 *pV,//指定轴的向量
FLOAT Angle//旋转的弧度
);
缩放:
D3DXMATRIX *D3DXMatrixScaling(
D3DXMATRIX* pOut, //返回的结果
FLOAT sx, //X轴上缩放的量
FLOAT sy, //Y轴上缩放的量
FLOAT sz //Z轴上缩放的量
);
//变换向量随矩阵。
D3DXVECTOR3 * D3DXVec3TransformCoord(
D3DXVECTOR3 * pOut,//输出向量
CONST D3DXVECTOR3 * pV,//输入向量
CONST D3DXMATRIX * pM//输入矩阵
);
#1
哪里一定要三维向量只与4X4矩阵的左上角的3X3矩阵相乘吗?
一般在 shader里都是这样写的,mul (float4(vPos, matProj));
一般在 shader里都是这样写的,mul (float4(vPos, matProj));
#2
shader里可以支持大矩阵转换为小矩阵,比如
(float3x3)M, M为float4x4的矩阵。
如果dx不能这样转换,可以自己转换,取出4x4矩阵中的左上3x3元素生成一个新矩阵即可。或者把3维向量用4维齐次坐标来表示
(float3x3)M, M为float4x4的矩阵。
如果dx不能这样转换,可以自己转换,取出4x4矩阵中的左上3x3元素生成一个新矩阵即可。或者把3维向量用4维齐次坐标来表示
#3
向量乘矩阵得一个向量。DX里是有这个函数,真正做计算的4x4个也只有4个,有一个一直保持为1。
平移、缩放、旋转。用到的变量都不一样。
希望能为你提供帮助
相关函数:
平移:
D3DXMATRIX *D3DXMatrixTranslation(
D3DXMATRIX* pOut,//返回的结果
FLOAT x, //X轴上的平移量
FLOAT y, //Y轴上的平移量
FLOAT z) //Z轴上的平移量
绕X轴旋转:
D3DXMATRIX *D3DXMatrixRotationX(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Y轴旋转:
D3DXMATRIX *D3DXMatrixRotationY(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Z轴旋转:
D3DXMATRIX *D3DXMatrixRotationZ(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕指定轴旋转:
D3DXMATRIX *D3DXMatrixRotationAxis(
D3DXMATRIX *pOut,//返回的结果
CONST D3DXVECTOR3 *pV,//指定轴的向量
FLOAT Angle//旋转的弧度
);
缩放:
D3DXMATRIX *D3DXMatrixScaling(
D3DXMATRIX* pOut, //返回的结果
FLOAT sx, //X轴上缩放的量
FLOAT sy, //Y轴上缩放的量
FLOAT sz //Z轴上缩放的量
);
//变换向量随矩阵。
D3DXVECTOR3 * D3DXVec3TransformCoord(
D3DXVECTOR3 * pOut,//输出向量
CONST D3DXVECTOR3 * pV,//输入向量
CONST D3DXMATRIX * pM//输入矩阵
);
平移、缩放、旋转。用到的变量都不一样。
希望能为你提供帮助
相关函数:
平移:
D3DXMATRIX *D3DXMatrixTranslation(
D3DXMATRIX* pOut,//返回的结果
FLOAT x, //X轴上的平移量
FLOAT y, //Y轴上的平移量
FLOAT z) //Z轴上的平移量
绕X轴旋转:
D3DXMATRIX *D3DXMatrixRotationX(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Y轴旋转:
D3DXMATRIX *D3DXMatrixRotationY(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕Z轴旋转:
D3DXMATRIX *D3DXMatrixRotationZ(
D3DXMATRIX* pOut, //返回的结果
FLOAT Angle //旋转的弧度
);
绕指定轴旋转:
D3DXMATRIX *D3DXMatrixRotationAxis(
D3DXMATRIX *pOut,//返回的结果
CONST D3DXVECTOR3 *pV,//指定轴的向量
FLOAT Angle//旋转的弧度
);
缩放:
D3DXMATRIX *D3DXMatrixScaling(
D3DXMATRIX* pOut, //返回的结果
FLOAT sx, //X轴上缩放的量
FLOAT sy, //Y轴上缩放的量
FLOAT sz //Z轴上缩放的量
);
//变换向量随矩阵。
D3DXVECTOR3 * D3DXVec3TransformCoord(
D3DXVECTOR3 * pOut,//输出向量
CONST D3DXVECTOR3 * pV,//输入向量
CONST D3DXMATRIX * pM//输入矩阵
);