コード例 #1
0
ファイル: helper_3dmath.c プロジェクト: jee4404/mpu6050
void normalizeVector(VectorFloat* aVector)
{
    float mag = getVectorMagnitude(aVector);
    aVector->x = aVector->x / mag;
    aVector->y = aVector->y / mag;
    aVector->z = aVector->z / mag;
}
コード例 #2
0
ファイル: Primitive.cpp プロジェクト: shadowwalk/3dGraphic
bool CTriangle::Intersects(GzRay ray, float &tValue)
{
	GzCoord L1, L2;
	L1[X] = m_trianglePrimitives.vertexList[1][X] - m_trianglePrimitives.vertexList[0][X];
	L1[Y] = m_trianglePrimitives.vertexList[1][Y] - m_trianglePrimitives.vertexList[0][Y];
	L1[Z] = m_trianglePrimitives.vertexList[1][Z] - m_trianglePrimitives.vertexList[0][Z];

	L2[X] = m_trianglePrimitives.vertexList[2][X] - m_trianglePrimitives.vertexList[0][X];
	L2[Y] = m_trianglePrimitives.vertexList[2][Y] - m_trianglePrimitives.vertexList[0][Y];
	L2[Z] = m_trianglePrimitives.vertexList[2][Z] - m_trianglePrimitives.vertexList[0][Z];

	GzCoord distanceVec;
	distanceVec[X] = ray.origin[X] - m_trianglePrimitives.vertexList[0][X];
	distanceVec[Y] = ray.origin[Y] - m_trianglePrimitives.vertexList[0][Y];
	distanceVec[Z] = ray.origin[Z] - m_trianglePrimitives.vertexList[0][Z];

	float distance = getVectorMagnitude(distanceVec);

	GzCoord S1;
	crossProduct(ray.direction,L2,&S1);
	float d = 1 / dotProduct(S1,L1);

	float u = dotProduct(distanceVec, S1) * d; //1st barycentric coordinate

	if(u < 0 || u > 1) 
		return false;

	GzCoord S2;
	crossProduct(distanceVec,L1,&S2);
	
	float v = dotProduct(ray.direction, S2) * d; //2nd barycentric coordinate

	if(v < 0 || (u+v) > 1)
		return false;

	tValue = dotProduct(L2, S2) * d;

	return true;
}