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;
}
Example #3
0
/* 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;
}