Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 27, 2008, 8:07:29 AM (16 years ago)
Author:
rgrieder
Message:

updated input branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/input/src/util/Math.cc

    r1505 r1629  
    2727 */
    2828
     29#include <OgrePlane.h>
     30
    2931#include "Math.h"
     32#include "Convert.h"
    3033
    3134/**
     
    6871    return in;
    6972}
     73
     74
     75float 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
     85orxonox::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
     102orxonox::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
     123orxonox::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
     140unsigned long getUniqueNumber()
     141{
     142    static unsigned long aNumber = 135;
     143    return aNumber++;
     144}
     145
     146std::string getUniqueNumberStr()
     147{
     148    return convertToString(getUniqueNumber());
     149}
Note: See TracChangeset for help on using the changeset viewer.