Changeset 9945 for code/trunk/src/libraries/util
- Timestamp:
- Jan 3, 2014, 1:50:22 PM (12 years ago)
- File:
-
- 1 edited
-
code/trunk/src/libraries/util/Math.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/libraries/util/Math.cc
r9939 r9945 204 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 205 { 206 // Orxonox Vectors: x_direction you are looking, y_direction points up, z_direction points to the right207 orxonox::Vector3 distance = otherposition - myposition;// get vector from Ship to object208 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 vector214 215 distance = 4*distance / detectionlimit; // shrink vector on map216 if(distance.length() > 1.0f) // if object would wander outside of the map217 {218 distance = distance / distance.length();219 }220 221 // perform a coordinate transformation to get distance in relation of the position of the ship222 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 side226 float ycoordinate = distanceShip.x*sin(mapangle)+distanceShip.y*cos(mapangle);227 return orxonox::Vector2(xcoordinate , ycoordinate);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 228 } 229 229 … … 243 243 bool isObjectHigherThanShipOnMap(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float mapangle) 244 244 { 245 // Orxonox Vectors: x_direction you are looking, y_direction points up, z_direction points to the right246 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 object253 254 255 // perform a coordinate transformation to get distance in relation of the position of the ship256 orxonox::Vector3 distanceShip = getTransformedVector(distance, mydirection, myorthonormal, myside);257 258 if(distanceShip.y >= 0)259 return true;260 else261 return false;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 262 } 263 263 … … 265 265 @brief A value between 0 and 10, in order how other object is in front or in back 266 266 @param myposition My position 267 @param mydirection My viewing direction268 @param myorthonormal My orthonormalvector (pointing upwards through my head)269 @param otherposition The position of the other object270 @param detectionlimit The limit in which objects are shown on the map267 @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 271 @return value between 0 and 100 272 272 */ 273 273 int determineMap3DZOrder(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition, const float detectionlimit) 274 274 { 275 orxonox::Vector3 distance = otherposition - myposition;// get vector from Ship to object276 orxonox::Vector3 myside = mydirection.crossProduct(myorthonormal);// get vector to the side277 278 distance = 4*distance / detectionlimit; // shrink vector on map279 if(distance.length() > 1.0f) // if object would wander outside of the map280 {281 distance = distance / distance.length();282 }283 284 // perform a coordinate transformation to get distance in relation of the position of the ship285 orxonox::Vector3 distanceShip = getTransformedVector(distance, mydirection, myorthonormal, myside);286 287 return (int) 50 - 100*distanceShip.x;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 288 } 289 289 … … 300 300 y is vector in old coordinates 301 301 T is transform matrix with: 302 T = (t1 , t2 , t3)303 t1 = mydirection304 t2 = myorthonormal305 t3 = myside302 T = (t1 , t2 , t3) 303 t1 = mydirection 304 t2 = myorthonormal 305 t3 = myside 306 306 307 307 y = T^(-1)*x … … 309 309 orxonox::Vector3 getTransformedVector(const orxonox::Vector3& distance, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& myside) 310 310 { 311 // inverse of the transform matrix312 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 matrix318 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 transformation333 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;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; 339 339 } 340 340
Note: See TracChangeset
for help on using the changeset viewer.










