Changeset 1629 for code/branches/input/src/util/Math.cc
- Timestamp:
- Jun 27, 2008, 8:07:29 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/input/src/util/Math.cc
r1505 r1629 27 27 */ 28 28 29 #include <OgrePlane.h> 30 29 31 #include "Math.h" 32 #include "Convert.h" 30 33 31 34 /** … … 68 71 return in; 69 72 } 73 74 75 float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition) 76 { 77 orxonox::Vector3 distance = otherposition - myposition; 78 float distancelength = distance.length(); 79 if (distancelength == 0) 80 return 0; 81 else 82 return acos(clamp<float>(mydirection.dotProduct(distance) / distancelength, -1, 1)); 83 } 84 85 orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition) 86 { 87 orxonox::Vector3 distance = otherposition - myposition; 88 89 // project difference vector on our plane 90 orxonox::Vector3 projection = Ogre::Plane(mydirection, myposition).projectVector(distance); 91 92 float projectionlength = projection.length(); 93 if (projectionlength == 0) return orxonox::Vector2(0, 0); 94 float angle = acos(clamp<float>(myorthonormal.dotProduct(projection) / projectionlength, -1, 1)); 95 96 if ((mydirection.crossProduct(myorthonormal)).dotProduct(distance) > 0) 97 return orxonox::Vector2(sin(angle), cos(angle)); 98 else 99 return orxonox::Vector2(-sin(angle), cos(angle)); 100 } 101 102 orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition) 103 { 104 orxonox::Vector3 distance = otherposition - myposition; 105 106 // project difference vector on our plane 107 orxonox::Vector3 projection = Ogre::Plane(mydirection, myposition).projectVector(distance); 108 109 float projectionlength = projection.length(); 110 if (projectionlength == 0) return orxonox::Vector2(0, 0); 111 float angle = acos(clamp<float>(myorthonormal.dotProduct(projection) / projectionlength, -1, 1)); 112 113 float distancelength = distance.length(); 114 if (distancelength == 0) return orxonox::Vector2(0, 0); 115 float radius = acos(clamp<float>(mydirection.dotProduct(distance) / distancelength, -1, 1)) / Ogre::Math::PI; 116 117 if ((mydirection.crossProduct(myorthonormal)).dotProduct(distance) > 0) 118 return orxonox::Vector2(sin(angle) * radius, cos(angle) * radius); 119 else 120 return orxonox::Vector2(-sin(angle) * radius, cos(angle) * radius); 121 } 122 123 orxonox::Vector3 getPredictedPosition(const orxonox::Vector3& myposition, float projectilespeed, const orxonox::Vector3& targetposition, const orxonox::Vector3& targetvelocity) 124 { 125 float squaredProjectilespeed = projectilespeed * projectilespeed; 126 orxonox::Vector3 distance = targetposition - myposition; 127 float a = distance.squaredLength(); 128 float b = 2 * (distance.x + distance.y + distance.z) * (targetvelocity.x + targetvelocity.y + targetvelocity.z); 129 float c = targetvelocity.squaredLength(); 130 131 float temp = 4*squaredProjectilespeed*c + a*a - 4*b*c; 132 if (temp < 0) 133 return orxonox::Vector3::ZERO; 134 135 temp = sqrt(temp); 136 float time = (temp + a) / (2 * (squaredProjectilespeed - b)); 137 return (targetposition + targetvelocity * time); 138 } 139 140 unsigned long getUniqueNumber() 141 { 142 static unsigned long aNumber = 135; 143 return aNumber++; 144 } 145 146 std::string getUniqueNumberStr() 147 { 148 return convertToString(getUniqueNumber()); 149 }
Note: See TracChangeset
for help on using the changeset viewer.