收一份D3DXVec3Project算法
要求纯算法不依赖D3DXVec3Project 火山或者易语言的企鹅977189077 加我时备注g海 天价勿扰
答应我,别当冤种了好吗{:sad:}
https://github.com/wine-mirror/wine/blob/90103fa07e5c23c7500c7d33e538b0610bf3c27d/dlls/d3dx9_36/math.c#L1828
#ifdef NONAMELESSUNION
# define D3DX_U(x)(x).u
#else
# define D3DX_U(x)(x)
#endif
static inline D3DXMATRIX* D3DXMatrixIdentity(D3DXMATRIX *pout)
{
if ( !pout ) return NULL;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 0.0f;
D3DX_U(*pout).m = 1.0f;
D3DX_U(*pout).m = 1.0f;
D3DX_U(*pout).m = 1.0f;
D3DX_U(*pout).m = 1.0f;
return pout;
}
D3DXMATRIX* WINAPI D3DXMatrixMultiply(D3DXMATRIX *pout, const D3DXMATRIX *pm1, const D3DXMATRIX *pm2)
{
D3DXMATRIX out;
int i,j;
//TRACE("pout %p, pm1 %p, pm2 %p\n", pout, pm1, pm2);
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
out.m = pm1->m * pm2->m + pm1->m * pm2->m + pm1->m * pm2->m + pm1->m * pm2->m;
}
}
*pout = out;
return pout;
}
D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv, const D3DXMATRIX *pm)
{
D3DXVECTOR3 out;
FLOAT norm;
//TRACE("pout %p, pv %p, pm %p\n", pout, pv, pm);
norm = pm->m * pv->x + pm->m * pv->y + pm->m *pv->z + pm->m;
out.x = (pm->m * pv->x + pm->m * pv->y + pm->m * pv->z + pm->m) / norm;
out.y = (pm->m * pv->x + pm->m * pv->y + pm->m * pv->z + pm->m) / norm;
out.z = (pm->m * pv->x + pm->m * pv->y + pm->m * pv->z + pm->m) / norm;
*pout = out;
return pout;
}
D3DXVECTOR3* WINAPI D3DXVec3Project(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv, const D3DVIEWPORT9 *pviewport, const D3DXMATRIX *pprojection, const D3DXMATRIX *pview, const D3DXMATRIX *pworld)
{
D3DXMATRIX m;
//TRACE("pout %p, pv %p, pviewport %p, pprojection %p, pview %p, pworld %p\n", pout, pv, pviewport, pprojection, pview, pworld);
D3DXMatrixIdentity(&m);
if (pworld) D3DXMatrixMultiply(&m, &m, pworld);
if (pview) D3DXMatrixMultiply(&m, &m, pview);
if (pprojection) D3DXMatrixMultiply(&m, &m, pprojection);
D3DXVec3TransformCoord(pout, pv, &m);
if (pviewport)
{
pout->x = pviewport->X +( 1.0f + pout->x ) * pviewport->Width / 2.0f;
pout->y = pviewport->Y +( 1.0f - pout->y ) * pviewport->Height / 2.0f;
pout->z = pviewport->MinZ + pout->z * ( pviewport->MaxZ - pviewport->MinZ );
}
return pout;
} 真的不错呢,很不错的样子 算法很简单这是E的直接套上就能用{:funk:}
.版本 2
视角宽 = 窗口宽 ÷ 2
视角高 = 窗口高 ÷ 2
相机Z = ViewWorld × 敌人X + ViewWorld × 敌人Y + ViewWorld × 敌人Z + ViewWorld
' 输出调试文本 (相机Z)
.如果真 (相机Z < 0)
返回 ()
.如果真结束
缩放比例 = 1 ÷ 相机Z
相机X = 视角宽 + (ViewWorld × 敌人X + ViewWorld × 敌人Y + ViewWorld × 敌人Z + ViewWorld ) × 缩放比例 × 视角宽
相机Y = 视角高 - (ViewWorld × 敌人X + ViewWorld × 敌人Y + ViewWorld × (敌人Z + 26) + ViewWorld ) × 缩放比例 × 视角高' 头
相机Y2 = 视角高 - (ViewWorld × 敌人X + ViewWorld × 敌人Y + ViewWorld × (敌人Z - 35) + ViewWorld ) × 缩放比例 × 视角高' 脚
方框宽高 = 相机Y2 - 相机Y
页:
[1]