Exemplo n.º 1
0
 D3DXVECTOR3 rotateVec3ByQuat(const D3DXVECTOR3 *vec, const D3DXQUATERNION *quat)
 {
     D3DXQUATERNION conj, res;
     D3DXQuaternionConjugate(&conj,quat);
     res = conj*D3DXQUATERNION(vec->x, vec->y, vec->z,1.f)*(*quat);
     return D3DXVECTOR3(res.x,res.y,res.z);
 }
Exemplo n.º 2
0
// used for finding the location of a part of the body in real coordinates
// to find the location of a real point in body coordinates, set inverse to true
D3DXVECTOR3	CBody::RotateVector(const D3DXVECTOR3& vec, bool inverse) const
{
	D3DXVECTOR3 returnVec;

	D3DXQUATERNION qPoint(vec.x, vec.y, vec.z, 0.0f);
	D3DXQUATERNION orientationConjugate;
	D3DXQuaternionConjugate(&orientationConjugate, &m_orientation);

	D3DXQUATERNION qFinalPoint;
	if (inverse)
	{
		qFinalPoint = orientationConjugate * qPoint * m_orientation;
	}
	else
	{
		qFinalPoint = m_orientation * qPoint * orientationConjugate;
	}

//	debugf("qFinalPoint x: %f\ty:%f\tz:%f\tw:%f\n", qFinalPoint.x, qFinalPoint.y, qFinalPoint.z, qFinalPoint.w);
	assert(qFinalPoint.w < 0.0001 && qFinalPoint.w > -0.0001);
	
	returnVec.x = qFinalPoint.x;
	returnVec.y = qFinalPoint.y;
	returnVec.z = qFinalPoint.z;

	return returnVec;
}
Exemplo n.º 3
0
// Putting this here until I find a better place for it!
D3DXVECTOR3 *D3DXVec3Rotate( D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, const D3DXQUATERNION *pQ )
{
    D3DXQUATERNION q1, q2;
    D3DXQuaternionConjugate( &q1, pQ );
    q2 = q1 * D3DXQUATERNION( pV->x, pV->y, pV->z, 1.0f ) * (*pQ);

	*pOut = D3DXVECTOR3( q2.x, q2.y, q2.z );
    return pOut;
}
Exemplo n.º 4
0
D3DXVECTOR3* D3DXVec3Rotation(D3DXVECTOR3* pvtOut, const D3DXVECTOR3* c_pvtSrc, const D3DXQUATERNION* c_pqtRot)
{
	D3DXQUATERNION qtSrc(c_pvtSrc->x, c_pvtSrc->y, c_pvtSrc->z, 0);
	D3DXQUATERNION qtRet;
	D3DXQuaternionConjugate(&qtRet, c_pqtRot);
	D3DXQuaternionMultiply(&qtRet, &qtSrc, &qtRet);
	D3DXQuaternionMultiply(&qtRet, c_pqtRot, &qtRet);

	pvtOut->x=qtRet.x;
	pvtOut->y=qtRet.y;
	pvtOut->z=qtRet.z;

	return pvtOut;
}
Exemplo n.º 5
0
    void Camera::moveCameraViewRelative(FLOAT x, FLOAT y, FLOAT z)
    {
        D3DXVECTOR3 dir(0,0,1);
        D3DXVECTOR3 up = m_up;
        D3DXVECTOR3 right;

        D3DXQUATERNION conj;
        D3DXQuaternionConjugate(&conj, &m_orientation);
        
        dir = MathUtil::rotateVec3ByQuat(&dir,&conj);
        up = MathUtil::rotateVec3ByQuat(&up,&conj);
        D3DXVec3Cross(&right, &up, &dir);

        m_translation -= x*right + y*up + z*dir;
        m_viewCacheValid = false;
    }
Exemplo n.º 6
0
bool CPythonItem::TGroundItemInstance::Update()
{
	if (bAnimEnded)
		return false;
	if (dwEndTime < CTimer::Instance().GetCurrentMillisecond())
	{
		ThingInstance.SetRotationQuaternion(qEnd);

		/*D3DXVECTOR3 v3Adjust = -v3Center;
		D3DXMATRIX mat;
		D3DXMatrixRotationYawPitchRoll(&mat, 
		D3DXToRadian(rEnd.y), 
		D3DXToRadian(rEnd.x), 
		D3DXToRadian(rEnd.z));
		D3DXVec3TransformCoord(&v3Adjust,&v3Adjust,&mat);*/

		D3DXQUATERNION qAdjust(-v3Center.x, -v3Center.y, -v3Center.z, 0.0f);
		D3DXQUATERNION qc;
		D3DXQuaternionConjugate(&qc, &qEnd);
		D3DXQuaternionMultiply(&qAdjust,&qAdjust,&qEnd);
		D3DXQuaternionMultiply(&qAdjust,&qc,&qAdjust);

		ThingInstance.SetPosition(v3EndPosition.x+qAdjust.x, 
			v3EndPosition.y+qAdjust.y,
			v3EndPosition.z+qAdjust.z);
		//ThingInstance.Update();
		bAnimEnded = true;

		__PlayDropSound(eDropSoundType, v3EndPosition);
	}
	else
	{
		DWORD time = CTimer::Instance().GetCurrentMillisecond() - dwStartTime;
		DWORD etime = dwEndTime - CTimer::Instance().GetCurrentMillisecond();
		float rate = time * 1.0f / (dwEndTime - dwStartTime);

		D3DXVECTOR3 v3NewPosition=v3EndPosition;// = rate*(v3EndPosition - v3StartPosition) + v3StartPosition;
		v3NewPosition.z += 100-100*rate*(3*rate-2);//-100*(rate-1)*(3*rate+2);

		D3DXQUATERNION q;
		D3DXQuaternionRotationAxis(&q, &v3RotationAxis, etime * 0.03f *(-1+rate*(3*rate-2)));
		//ThingInstance.SetRotation(rEnd.y + etime*rStart.y, rEnd.x + etime*rStart.x, rEnd.z + etime*rStart.z);
		D3DXQuaternionMultiply(&q,&qEnd,&q);

		ThingInstance.SetRotationQuaternion(q);
		D3DXQUATERNION qAdjust(-v3Center.x, -v3Center.y, -v3Center.z, 0.0f);
		D3DXQUATERNION qc;
		D3DXQuaternionConjugate(&qc, &q);
		D3DXQuaternionMultiply(&qAdjust,&qAdjust,&q);
		D3DXQuaternionMultiply(&qAdjust,&qc,&qAdjust);
		
		ThingInstance.SetPosition(v3NewPosition.x+qAdjust.x, 
			v3NewPosition.y+qAdjust.y,
			v3NewPosition.z+qAdjust.z);
		
		/*D3DXVECTOR3 v3Adjust = -v3Center;
		D3DXMATRIX mat;
		D3DXMatrixRotationYawPitchRoll(&mat, 
		D3DXToRadian(rEnd.y + etime*rStart.y), 
		D3DXToRadian(rEnd.x + etime*rStart.x), 
		D3DXToRadian(rEnd.z + etime*rStart.z));
						
		D3DXVec3TransformCoord(&v3Adjust,&v3Adjust,&mat);
		//Tracef("%f %f %f\n",v3Adjust.x,v3Adjust.y,v3Adjust.z);
		v3NewPosition += v3Adjust;
		ThingInstance.SetPosition(v3NewPosition.x, v3NewPosition.y, v3NewPosition.z);*/
	}
	ThingInstance.Transform();
	ThingInstance.Deform();				
	return !bAnimEnded;
}
Exemplo n.º 7
0
bool	FX_CSkinRenderer::TransformMesh	(	Fx_CHARACTER_t	*in_char,
											const FX_CMesh	*pMesh,
											const KEYFRAME	*pKeyFrames,
											const int		in_sysVBNum,
											const int		in_skinPartID	)
{
	int		index;
	UINT	subindex;
	int		globalBoneID;
	TEXTUREVERTEX	*sysVB;
	float	numToMultiply;

	 
	sysVB	=	m_vertexBuffer;
	for	(	index	=	0;	\
			index	<	in_sysVBNum;	\
			++index,	++sysVB		)
	{
		sysVB ->vecPos [0]		=	sysVB ->vecPos [1]		=	sysVB ->vecPos [2]		=	0.0f;
		sysVB ->vecNormal [0]	=	sysVB ->vecNormal [1]	=	sysVB ->vecNormal [2]	=	0.0f;
		
		m_pVertexMap	=	&pMesh->m_meshes[ in_char->stat_LODLevel ].meshchunk->vertexMaps[ index ];
		m_pInfluence	=	&pMesh->m_meshes[ in_char->stat_LODLevel ].influences[ m_pVertexMap->iVertexID ];

		if	(	1	==	m_pInfluence->iNumBoneInfluences	)
		{
			m_pBoneInfluence	=	&m_pInfluence->boneInfluences	[0];

				 
			globalBoneID	=	m_pSkelManager->m_iBoneLookUp[ in_char->attr_skelID ][ m_pBoneInfluence->iBoneID ];

			D3DXQuaternionConjugate ( (D3DXQUATERNION *)g_quatConjugate,	(D3DXQUATERNION *)pKeyFrames [globalBoneID].quatCoordinate );

			 
			Fx_Quat3Multiply( g_quatAfterTransform,	g_quatBuffer,	pKeyFrames [globalBoneID].quatCoordinate,	m_pBoneInfluence ->quatPos,	g_quatConjugate );

			sysVB ->vecPos [0]	=	g_quatAfterTransform [0]	+	pKeyFrames [globalBoneID].vecOffset [0];
			sysVB ->vecPos [1]	=	g_quatAfterTransform [1]	+	pKeyFrames [globalBoneID].vecOffset [1];
			sysVB ->vecPos [2]	=	g_quatAfterTransform [2]	+	pKeyFrames [globalBoneID].vecOffset [2];

			 
			Fx_Quat3Multiply( g_quatAfterTransform,	g_quatBuffer,	pKeyFrames [globalBoneID].quatCoordinate,	m_pBoneInfluence ->quatNormal,	g_quatConjugate );

			VectorCopy ( sysVB ->vecNormal,	g_quatAfterTransform );
		}
		else
		{
			for	(	subindex	=	0;	\
					subindex	<	m_pInfluence ->iNumBoneInfluences;	\
					++subindex		)
			{
				m_pBoneInfluence	=	&m_pInfluence ->boneInfluences [subindex];

					 
				globalBoneID	=	m_pSkelManager->m_iBoneLookUp[ in_char->attr_skelID ][ m_pBoneInfluence->iBoneID ];
	
				D3DXQuaternionConjugate	( (D3DXQUATERNION *)g_quatConjugate,	(D3DXQUATERNION *)pKeyFrames [globalBoneID].quatCoordinate );
				 
				Fx_Quat3Multiply( g_quatAfterTransform,	g_quatBuffer,	pKeyFrames [globalBoneID].quatCoordinate,	m_pBoneInfluence ->quatPos,	g_quatConjugate	);
	
				sysVB ->vecPos [0]	+=	m_pBoneInfluence ->fWeight * ( g_quatAfterTransform [0]	+ pKeyFrames [globalBoneID].vecOffset [0] );
				sysVB ->vecPos [1]	+=	m_pBoneInfluence ->fWeight * ( g_quatAfterTransform [1]	+ pKeyFrames [globalBoneID].vecOffset [1] );
				sysVB ->vecPos [2]	+=	m_pBoneInfluence ->fWeight * ( g_quatAfterTransform [2]	+ pKeyFrames [globalBoneID].vecOffset [2] );
	
				 
				Fx_Quat3Multiply( g_quatAfterTransform,	g_quatBuffer,	pKeyFrames [globalBoneID].quatCoordinate,	m_pBoneInfluence ->quatNormal,	g_quatConjugate );
	
				sysVB ->vecNormal [0]	+=	m_pBoneInfluence->fWeight * g_quatAfterTransform [0];
				sysVB ->vecNormal [1]	+=	m_pBoneInfluence->fWeight * g_quatAfterTransform [1];
				sysVB ->vecNormal [2]	+=	m_pBoneInfluence->fWeight * g_quatAfterTransform [2];
			}
			switch	(	m_pInfluence ->iNumBoneInfluences	)
			{
			case	2:
				numToMultiply	=	0.2f;
				break;
			case	3:
				numToMultiply	=	0.333333f;
				break;
			case	4:
				numToMultiply	=	0.25f;
				break;
			case	5:
				numToMultiply	=	0.2f;
				break;
			default:
				ShowError ( "Bone Influence 개수가 6개 이상입니다!",	__FILE__,	__LINE__	);
				exit (0);
			}
			sysVB ->vecNormal [0]	*=	numToMultiply;
			sysVB ->vecNormal [1]	*=	numToMultiply;
			sysVB ->vecNormal [2]	*=	numToMultiply;
		}
		sysVB ->tu	=	m_pVertexMap ->VertexTC [0].tu;		 
		sysVB ->tv	=	1.0f - m_pVertexMap ->VertexTC [0].tv;
	}

	CopyVertex( in_char, m_vertexBuffer, in_sysVBNum, in_skinPartID );

	return	true;
}