[Orxonox-commit 5076] r9740 - in code/branches/radarDreiD/src: libraries/util modules/overlays/hud

wroennin at orxonox.net wroennin at orxonox.net
Mon Nov 4 15:17:32 CET 2013


Author: wroennin
Date: 2013-11-04 15:17:32 +0100 (Mon, 04 Nov 2013)
New Revision: 9740

Modified:
   code/branches/radarDreiD/src/libraries/util/Math.cc
   code/branches/radarDreiD/src/libraries/util/Math.h
   code/branches/radarDreiD/src/modules/overlays/hud/HUDRadar.cc
Log:
HUDRadar:function call get3DProjection updated; Math.cc: get3DProjection new transform matrix; Math.h updated

Modified: code/branches/radarDreiD/src/libraries/util/Math.cc
===================================================================
--- code/branches/radarDreiD/src/libraries/util/Math.cc	2013-11-04 13:29:15 UTC (rev 9739)
+++ code/branches/radarDreiD/src/libraries/util/Math.cc	2013-11-04 14:17:32 UTC (rev 9740)
@@ -195,6 +195,7 @@
             @brief Gets the 2D project vector for the 3D Radar .
             @param myposition My position
             @param mydirection My viewing direction
+            @param myorthonormal My orthonormalvector (pointing upwards through my head)
             @param otherposition The position of the other object
             @param mapangle The angle you look on the 3Dmap
             @param detectionlimit The limit in which objects are shown on the map
@@ -203,19 +204,41 @@
             Examples:
              -
         */
-    orxonox::Vector2 get3DProjection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition, const float mapangle, const float detectionlimit)
+    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)
     {
     	//
     	orxonox::Vector3 distance = otherposition - myposition;
 
-    	// project difference vector on our plane
-    	orxonox::Vector3 projection = Ogre::Plane(mydirection, myposition).projectVector(distance);
+    	// new coordinate system base y_coordinate
+    	orxonox::Vector3 myside = -mydirection.crossProduct(myorthonormal);
 
-    	//float projectionlength = projection.length();
+    	// inverse of the transform matrix
+    	float determinant = +mydirection.x * (myside.y*myorthonormal.z - myorthonormal.y*myside.z)
+    						-mydirection.y * (myside.x*myorthonormal.z - myside.z*myorthonormal.x)
+    						+mydirection.z * (myside.x*myorthonormal.y - myside.y*myorthonormal.x);
+    	float invdet = 1/determinant;
+    	orxonox::Vector3 xinvtransform;
+    	orxonox::Vector3 yinvtransform;
+    	orxonox::Vector3 zinvtransform;
 
-    	// project vector for the rotated 3DMap
-    	float xcoordinate = projection.y/(2*detectionlimit);
-    	float ycoordinate = (projection.x*sin(mapangle)+projection.z*cos(mapangle))/(2*detectionlimit);
+    	xinvtransform.x =  (myside.y      * myorthonormal.z - myorthonormal.y * myside.z       )*invdet;
+    	xinvtransform.y = -(mydirection.y * myorthonormal.z - mydirection.z   * myorthonormal.y)*invdet;
+    	xinvtransform.z =  (mydirection.y * myside.z        - mydirection.z   * myside.y       )*invdet;
+    	yinvtransform.x = -(myside.x      * myorthonormal.z - myside.z        * myorthonormal.x)*invdet;
+    	yinvtransform.y =  (mydirection.x * myorthonormal.z - mydirection.z   * myorthonormal.x)*invdet;
+    	yinvtransform.z = -(mydirection.x * myside.z        - myside.x        * mydirection.z  )*invdet;
+    	zinvtransform.x =  (myside.x      * myorthonormal.y - myorthonormal.x * myside.y       )*invdet;
+    	zinvtransform.y = -(mydirection.x * myorthonormal.y - myorthonormal.x * mydirection.y  )*invdet;
+    	zinvtransform.z =  (mydirection.x * myside.y        - myside.x        * mydirection.x  )*invdet;
+
+    	// coordinate transformation
+    	distance.x = (xinvtransform.x + yinvtransform.x + zinvtransform.x) * distance.x;
+    	distance.y = (xinvtransform.y + yinvtransform.y + zinvtransform.y) * distance.y;
+    	distance.z = (xinvtransform.z + yinvtransform.z + zinvtransform.z) * distance.z;
+
+    	// project vector for the rotated 3DMap on screen
+    	float xcoordinate = distance.y/(2*detectionlimit);
+    	float ycoordinate = (distance.x*sin(mapangle)+distance.z*cos(mapangle))/(2*detectionlimit);
     	return orxonox::Vector2(xcoordinate , ycoordinate);
     }
 

Modified: code/branches/radarDreiD/src/libraries/util/Math.h
===================================================================
--- code/branches/radarDreiD/src/libraries/util/Math.h	2013-11-04 13:29:15 UTC (rev 9739)
+++ code/branches/radarDreiD/src/libraries/util/Math.h	2013-11-04 14:17:32 UTC (rev 9740)
@@ -91,7 +91,7 @@
     _UtilExport float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition);
     _UtilExport orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);
     _UtilExport orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);
-    _UtilExport orxonox::Vector2 get3DProjection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition, const float mapangle, const float detectionlimit);
+    _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);
     _UtilExport orxonox::Vector3 getPredictedPosition(const orxonox::Vector3& myposition, float projectilespeed, const orxonox::Vector3& targetposition, const orxonox::Vector3& targetvelocity);
 
     /**

Modified: code/branches/radarDreiD/src/modules/overlays/hud/HUDRadar.cc
===================================================================
--- code/branches/radarDreiD/src/modules/overlays/hud/HUDRadar.cc	2013-11-04 13:29:15 UTC (rev 9739)
+++ code/branches/radarDreiD/src/modules/overlays/hud/HUDRadar.cc	2013-11-04 14:17:32 UTC (rev 9740)
@@ -63,7 +63,7 @@
         this->shapeMaterials_[RadarViewable::Dot]      = "RadarDot.png";
         this->shapeMaterials_[RadarViewable::Triangle] = "RadarTriangle.png";
         this->shapeMaterials_[RadarViewable::Square]   = "RadarSquare.png";
-        this->setDetectionLimit( 1000.0f );
+        this->setDetectionLimit( 3000.0f );
         this->owner_ = 0;
     }
 
@@ -169,7 +169,7 @@
 
             // calc position on radar...
             //Vector2 coord = get2DViewcoordinates(this->owner_->getPosition(), this->owner_->getOrientation() * WorldEntity::FRONT, this->owner_->getOrientation() * WorldEntity::UP, wePointer->getWorldPosition());
-            Vector2 coord = get3DProjection(this->owner_->getPosition(), this->owner_->getOrientation() * WorldEntity::FRONT, wePointer->getWorldPosition(), 0.6435011, detectionLimit_);
+            Vector2 coord = get3DProjection(this->owner_->getPosition(), this->owner_->getOrientation() * WorldEntity::FRONT, this->owner_->getOrientation() * WorldEntity::UP, wePointer->getWorldPosition(), 0.6435011, detectionLimit_);
             coord *= math::pi / 3.5f; // small adjustment to make it fit the texture
             it->second->setPosition((1.0f + coord.x - size) * 0.5f, (1.0f - coord.y - size) * 0.5f);
             if( distance < detectionLimit_ || detectionLimit_ < 0 )




More information about the Orxonox-commit mailing list