STDMETHODIMP CVectorObject::Rotate(float fTheta, IVector *pvres) { D3DVECTOR rlvThis, rlvRotated, rlvAxis; D3DVALUE valModulus; if (!pvres) return E_POINTER; rlvThis.x = m_x; rlvThis.y = m_y; rlvThis.z = m_z; rlvAxis.x = 0.0F; rlvAxis.y = 1.0F; rlvAxis.z = 0.0F; valModulus = D3DRMVectorModulus(&rlvThis); D3DRMVectorRotate(&rlvRotated, &rlvThis, &rlvAxis, fTheta); // D3DRMVectorRotate will return a unit vector. We need the original size vector. D3DRMVectorScale(&rlvRotated, &rlvRotated, valModulus); pvres->set(rlvRotated.x, rlvRotated.y, rlvRotated.z); return S_OK; }
STDMETHODIMP CVectorObject::RotateAboutAxis(float fTheta, float fAxisX, float fAxisY, float fAxisZ) { D3DVECTOR rlvThis, rlvRotated, rlvAxis; D3DVALUE valModulus; HRESULT hr = S_OK; if (fAxisX == 0.0f && fAxisY == 0.0f && fAxisZ == 0.0f) return E_INVALIDARG; rlvThis.x = m_x; rlvThis.y = m_y; rlvThis.z = m_z; rlvAxis.x = fAxisX; rlvAxis.y = fAxisY; rlvAxis.z = fAxisZ; valModulus = D3DRMVectorModulus(&rlvThis); D3DRMVectorRotate(&rlvRotated, &rlvThis, &rlvAxis, fTheta); // D3DRMVectorRotate will return a unit vector. We need the original size vector. D3DRMVectorScale(&rlvRotated, &rlvRotated, valModulus); hr = set(rlvRotated.x, rlvRotated.y, rlvRotated.z); return hr; }
/* Normalize a vector. Returns (1,0,0) if INPUT is the NULL vector. */ LPD3DVECTOR WINAPI D3DRMVectorNormalize(LPD3DVECTOR u) { D3DVALUE modulus = D3DRMVectorModulus(u); if(modulus) { D3DRMVectorScale(u,u,1.0/modulus); } else { u->u1.x=1.0; u->u2.y=0.0; u->u3.z=0.0; } return u; }