恒浩 发表于 2024-2-18 05:33:17

收一份D3DXVec3Project算法

要求纯算法不依赖D3DXVec3Project 火山或者易语言的
企鹅977189077 加我时备注g海 天价勿扰

private 发表于 2024-2-18 07:03:28

答应我,别当冤种了好吗{: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;
}

ytf228693995 发表于 2024-2-18 09:13:48

真的不错呢,很不错的样子

冷雨夜~~ 发表于 2024-2-19 12:54:27

算法很简单这是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]
查看完整版本: 收一份D3DXVec3Project算法