Changeset 9939 for code/trunk/src/libraries/util
- Timestamp:
- Dec 21, 2013, 11:16:54 PM (11 years ago)
- Location:
- code/trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk
- Property svn:mergeinfo changed
-
code/trunk/src/libraries/util/Math.cc
r8400 r9939 23 23 * Fabian 'x3n' Landau 24 24 * Co-authors: 25 * ...25 * Wolfgang Roenninger 26 26 * 27 27 */ … … 147 147 148 148 /** 149 @brief Gets the 2D viewing direction (up/down, left/right) to the position of the other object, multiplied with the viewing distance to the object (0 ° = 0, 180°= 1).149 @brief Gets the 2D viewing direction (up/down, left/right) to the position of the other object, multiplied with the viewing distance to the object (0� = 0, 180� = 1). 150 150 @param myposition My position 151 151 @param mydirection My viewing direction … … 189 189 else 190 190 return orxonox::Vector2( -sin_value * radius, cos_value * radius); 191 } 192 193 194 /** 195 @brief Gets the 2D project vector for the 3D Radar . 196 @param myposition My position 197 @param mydirection My viewing direction 198 @param myorthonormal My orthonormalvector (pointing upwards through my head) 199 @param otherposition The position of the other object 200 @param mapangle The angle between line of sight on screen and the 3Dmap-x/z-plain in radian 201 @param detectionlimit The limit in which objects are shown on the map 202 @return The viewing direction 203 */ 204 orxonox::Vector2 get3DProjection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float mapangle, const float detectionlimit) 205 { 206 // Orxonox Vectors: x_direction you are looking, y_direction points up, z_direction points to the right 207 orxonox::Vector3 distance = otherposition - myposition; // get vector from Ship to object 208 209 // new coordinate system: x_axsis: mydirection (points front) 210 // y_axsis: myorthonormal (points up) 211 // z_axsis: myside (points right) 212 213 orxonox::Vector3 myside = mydirection.crossProduct(myorthonormal); // get 3. base vector 214 215 distance = 4*distance / detectionlimit; // shrink vector on map 216 if(distance.length() > 1.0f) // if object would wander outside of the map 217 { 218 distance = distance / distance.length(); 219 } 220 221 // perform a coordinate transformation to get distance in relation of the position of the ship 222 orxonox::Vector3 distanceShip = getTransformedVector(distance, mydirection, myorthonormal, myside); 223 224 // calculate 2D vector on the map (with angle between x/z - plain and line of sight) 225 float xcoordinate = distanceShip.z; // z; cause x direction on screen is to the right side 226 float ycoordinate = distanceShip.x*sin(mapangle)+distanceShip.y*cos(mapangle); 227 return orxonox::Vector2(xcoordinate , ycoordinate); 228 } 229 230 /** 231 @brief Gets if a object is over the x/z - plain on map 232 @param myposition My position 233 @param mydirection My viewing direction 234 @param myorthonormal My orthonormalvector (pointing upwards through my head) 235 @param otherposition The position of the other object 236 @param mapangle The angle you look on the 3Dmap in radian 237 @return If distancevector to the other object has a positive y-coordinate 238 239 Examples: 240 Returns true if object is over x/z - plain 241 Returns false if object is below x/z -plain 242 */ 243 bool isObjectHigherThanShipOnMap(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float mapangle) 244 { 245 // Orxonox Vectors: x_direction you are looking, y_direction points up, z_direction points to the right 246 orxonox::Vector3 distance = otherposition - myposition; 247 248 // new coordinate system: x_axsis: mydirection (points front) 249 // y_axsis: myorthonormal (points up) 250 // z_axsis: myside (points right) 251 252 orxonox::Vector3 myside = mydirection.crossProduct(myorthonormal); // get vector from Ship to object 253 254 255 // perform a coordinate transformation to get distance in relation of the position of the ship 256 orxonox::Vector3 distanceShip = getTransformedVector(distance, mydirection, myorthonormal, myside); 257 258 if(distanceShip.y >= 0) 259 return true; 260 else 261 return false; 262 } 263 264 /** 265 @brief A value between 0 and 10, in order how other object is in front or in back 266 @param myposition My position 267 @param mydirection My viewing direction 268 @param myorthonormal My orthonormalvector (pointing upwards through my head) 269 @param otherposition The position of the other object 270 @param detectionlimit The limit in which objects are shown on the map 271 @return value between 0 and 100 272 */ 273 int determineMap3DZOrder(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float detectionlimit) 274 { 275 orxonox::Vector3 distance = otherposition - myposition; // get vector from Ship to object 276 orxonox::Vector3 myside = mydirection.crossProduct(myorthonormal); // get vector to the side 277 278 distance = 4*distance / detectionlimit; // shrink vector on map 279 if(distance.length() > 1.0f) // if object would wander outside of the map 280 { 281 distance = distance / distance.length(); 282 } 283 284 // perform a coordinate transformation to get distance in relation of the position of the ship 285 orxonox::Vector3 distanceShip = getTransformedVector(distance, mydirection, myorthonormal, myside); 286 287 return (int) 50 - 100*distanceShip.x; 288 } 289 290 291 /** 292 @brief Gets the new vector after a coordinate transformation 293 @param distance Vector which will be transformed 294 @param mydirection New x basevector 295 @param myorthonormal New y basevector 296 @param otherposition New z basevector 297 @return direction in the new coordinates 298 299 x is vector in old coordinates 300 y is vector in old coordinates 301 T is transform matrix with: 302 T = (t1 , t2 , t3) 303 t1 = mydirection 304 t2 = myorthonormal 305 t3 = myside 306 307 y = T^(-1)*x 308 */ 309 orxonox::Vector3 getTransformedVector(const orxonox::Vector3& distance, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& myside) 310 { 311 // inverse of the transform matrix 312 float determinant = +mydirection.x * (myorthonormal.y*myside.z - myside.y*myorthonormal.z) 313 -mydirection.y * (myorthonormal.x*myside.z - myorthonormal.z*myside.x) 314 +mydirection.z * (myorthonormal.x*myside.y - myorthonormal.y*myside.x); 315 float invdet = 1/determinant; 316 317 // transform matrix 318 orxonox::Vector3 xinvtransform; 319 orxonox::Vector3 yinvtransform; 320 orxonox::Vector3 zinvtransform; 321 322 xinvtransform.x = (myorthonormal.y * myside.z - myside.y * myorthonormal.z)*invdet; 323 xinvtransform.y = (mydirection.z * myside.y - mydirection.y * myside.z )*invdet; 324 xinvtransform.z = (mydirection.y * myorthonormal.z - mydirection.z * myorthonormal.y)*invdet; 325 yinvtransform.x = (myorthonormal.z * myside.x - myorthonormal.x * myside.z )*invdet; 326 yinvtransform.y = (mydirection.x * myside.z - mydirection.z * myside.x )*invdet; 327 yinvtransform.z = (myorthonormal.x * mydirection.z - mydirection.x * myorthonormal.z)*invdet; 328 zinvtransform.x = (myorthonormal.x * myside.y - myside.x * myorthonormal.y)*invdet; 329 zinvtransform.y = (myside.x * mydirection.y - mydirection.x * myside.y )*invdet; 330 zinvtransform.z = (mydirection.x * myorthonormal.y - myorthonormal.x * mydirection.y )*invdet; 331 332 // coordinate transformation 333 orxonox::Vector3 distanceShip; 334 distanceShip.x = xinvtransform.x * distance.x + yinvtransform.x * distance.y + zinvtransform.x * distance.z; 335 distanceShip.y = xinvtransform.y * distance.x + yinvtransform.y * distance.y + zinvtransform.y * distance.z; 336 distanceShip.z = xinvtransform.z * distance.x + yinvtransform.z * distance.y + zinvtransform.z * distance.z; 337 338 return distanceShip; 191 339 } 192 340 -
code/trunk/src/libraries/util/Math.h
r9550 r9939 23 23 * Fabian 'x3n' Landau 24 24 * Co-authors: 25 * ...25 * Wolfgang Roenninger 26 26 * 27 27 */ … … 92 92 _UtilExport orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition); 93 93 _UtilExport orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition); 94 _UtilExport orxonox::Vector2 get3DProjection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float mapangle, const float detectionlimit); 95 _UtilExport bool isObjectHigherThanShipOnMap(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float mapangle); 96 _UtilExport int determineMap3DZOrder(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float detectionlimit); 97 _UtilExport orxonox::Vector3 getTransformedVector(const orxonox::Vector3& distance, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& myside); 94 98 _UtilExport orxonox::Vector3 getPredictedPosition(const orxonox::Vector3& myposition, float projectilespeed, const orxonox::Vector3& targetposition, const orxonox::Vector3& targetvelocity); 95 99
Note: See TracChangeset
for help on using the changeset viewer.