📄 vectormath.cpp
字号:
// Vector Math Functions// OpenGL SuperBible gltools library// Richard S. Wright Jr.// One note of interest. These REALLY should be inlined. I'm sorry I was too stupid at the time// to figure out how to get inlining to work on all the platforms and different compilers I use.// this seemed simpler than a ton of #ifdef's all over the place. Watch the web site as I may// make frequent improvments to the library.#include "gltools.h"#include <math.h>// Adds two vectors togethervoid gltAddVectors(const GLTVector3 vFirst, const GLTVector3 vSecond, GLTVector3 vResult) { vResult[0] = vFirst[0] + vSecond[0]; vResult[1] = vFirst[1] + vSecond[1]; vResult[2] = vFirst[2] + vSecond[2]; }// Subtract one vector from anothervoid gltSubtractVectors(const GLTVector3 vFirst, const GLTVector3 vSecond, GLTVector3 vResult) { vResult[0] = vFirst[0] - vSecond[0]; vResult[1] = vFirst[1] - vSecond[1]; vResult[2] = vFirst[2] - vSecond[2]; }// Scales a vector by a scalarvoid gltScaleVector(GLTVector3 vVector, const GLfloat fScale) { vVector[0] *= fScale; vVector[1] *= fScale; vVector[2] *= fScale; }// Gets the length of a vector squaredGLfloat gltGetVectorLengthSqrd(const GLTVector3 vVector) { return (vVector[0]*vVector[0]) + (vVector[1]*vVector[1]) + (vVector[2]*vVector[2]); } // Gets the length of a vectorGLfloat gltGetVectorLength(const GLTVector3 vVector) { return (GLfloat)sqrt(gltGetVectorLengthSqrd(vVector)); } // Scales a vector by it's length - creates a unit vectorvoid gltNormalizeVector(GLTVector3 vNormal) { GLfloat fLength = 1.0f / gltGetVectorLength(vNormal); gltScaleVector(vNormal, fLength); } // Copies a vectorvoid gltCopyVector(const GLTVector3 vSource, GLTVector3 vDest) { memcpy(vDest, vSource, sizeof(GLTVector3)); }// Get the dot product between two vectorsGLfloat gltVectorDotProduct(const GLTVector3 vU, const GLTVector3 vV) { return vU[0]*vV[0] + vU[1]*vV[1] + vU[2]*vV[2]; }// Calculate the cross product of two vectorsvoid gltVectorCrossProduct(const GLTVector3 vU, const GLTVector3 vV, GLTVector3 vResult) { vResult[0] = vU[1]*vV[2] - vV[1]*vU[2]; vResult[1] = -vU[0]*vV[2] + vV[0]*vU[2]; vResult[2] = vU[0]*vV[1] - vV[0]*vU[1]; }// Given three points on a plane in counter clockwise order, calculate the unit normalvoid gltGetNormalVector(const GLTVector3 vP1, const GLTVector3 vP2, const GLTVector3 vP3, GLTVector3 vNormal) { GLTVector3 vV1, vV2; gltSubtractVectors(vP2, vP1, vV1); gltSubtractVectors(vP3, vP1, vV2); gltVectorCrossProduct(vV1, vV2, vNormal); gltNormalizeVector(vNormal); }// Transform a point by a 4x4 matrixvoid gltTransformPoint(const GLTVector3 vSrcVector, const GLTMatrix mMatrix, GLTVector3 vOut) { vOut[0] = mMatrix[0] * vSrcVector[0] + mMatrix[4] * vSrcVector[1] + mMatrix[8] * vSrcVector[2] + mMatrix[12]; vOut[1] = mMatrix[1] * vSrcVector[0] + mMatrix[5] * vSrcVector[1] + mMatrix[9] * vSrcVector[2] + mMatrix[13]; vOut[2] = mMatrix[2] * vSrcVector[0] + mMatrix[6] * vSrcVector[1] + mMatrix[10] * vSrcVector[2] + mMatrix[14]; }// Rotates a vector using a 4x4 matrix. Translation column is ignoredvoid gltRotateVector(const GLTVector3 vSrcVector, const GLTMatrix mMatrix, GLTVector3 vOut) { vOut[0] = mMatrix[0] * vSrcVector[0] + mMatrix[4] * vSrcVector[1] + mMatrix[8] * vSrcVector[2]; vOut[1] = mMatrix[1] * vSrcVector[0] + mMatrix[5] * vSrcVector[1] + mMatrix[9] * vSrcVector[2]; vOut[2] = mMatrix[2] * vSrcVector[0] + mMatrix[6] * vSrcVector[1] + mMatrix[10] * vSrcVector[2]; }// Gets the three coefficients of a plane equation given three points on the plane.void gltGetPlaneEquation(GLTVector3 vPoint1, GLTVector3 vPoint2, GLTVector3 vPoint3, GLTVector3 vPlane) { // Get normal vector from three points. The normal vector is the first three coefficients // to the plane equation... gltGetNormalVector(vPoint1, vPoint2, vPoint3, vPlane); // Final coefficient found by back substitution vPlane[3] = -(vPlane[0] * vPoint3[0] + vPlane[1] * vPoint3[1] + vPlane[2] * vPoint3[2]); } // Determine the distance of a point from a plane, given the point and the// equation of the plane.GLfloat gltDistanceToPlane(GLTVector3 vPoint, GLTVector4 vPlane) { return vPoint[0]*vPlane[0] + vPoint[1]*vPlane[1] + vPoint[2]*vPlane[2] + vPlane[3]; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -