Ignore:
Timestamp:
Mar 11, 2012 8:43:18 PM (12 years ago)
Author:
ldelgass
Message:

Some additions to quat/rotation classes in vrmath lib

Location:
trunk/packages/vizservers/nanovis/vrmath
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/nanovis/vrmath/include/vrmath/vrMatrix4x4f.h

    r2841 r2842  
    1111{
    1212public:
     13    vrMatrix4x4f()
     14    {
     15        makeIdentity();
     16    }
     17
    1318    /**
    1419     * @brief make a identity matrix
  • trunk/packages/vizservers/nanovis/vrmath/include/vrmath/vrQuaternion.h

    r2841 r2842  
    1717public:
    1818    vrQuaternion();
     19
    1920    explicit vrQuaternion(const vrRotation& rot);
     21
    2022    vrQuaternion(float x, float y = 0, float z = 0, float w = 0);
    2123
    2224    void set(float x1, float y1, float z1, float w1);
     25
    2326    const vrQuaternion& set(const vrRotation& rot);
     27
     28    vrQuaternion conjugate() const
     29    {
     30        vrQuaternion result;
     31        result.w = w;
     32        result.x = -x;
     33        result.y = -y;
     34        result.z = -z;
     35        return result;
     36    }
     37
     38    vrQuaternion reciprocal() const
     39    {
     40        double denom =  w*w + x*x + y*y + z*z;
     41        vrQuaternion result = conjugate();
     42        result.x /= denom;
     43        result.y /= denom;
     44        result.z /= denom;
     45        result.w /= denom;
     46        return result;
     47    }
    2448
    2549    void slerp(const vrRotation &a,const vrRotation &b, const float t);
     
    2852
    2953    const vrQuaternion& normalize();
     54
     55    vrQuaternion operator*(const vrQuaternion& q2) const
     56    {
     57        vrQuaternion result;
     58        result.w = (w * q2.w) - (x * q2.x) - (y * q2.y) - (z * q2.z);
     59        result.x = (w * q2.x) + (x * q2.w) + (y * q2.z) - (z * q2.y);
     60        result.y = (w * q2.y) + (y * q2.w) + (z * q2.x) - (x * q2.z);
     61        result.z = (w * q2.z) + (z * q2.w) + (x * q2.y) - (y * q2.x);
     62        return result;
     63    }
    3064
    3165    friend bool operator==(const vrQuaternion& q1, const vrQuaternion& q2);
  • trunk/packages/vizservers/nanovis/vrmath/include/vrmath/vrRotation.h

    r2841 r2842  
    88class vrQuaternion;
    99
     10/**
     11 * Represents an axis/angle rotation
     12 */
    1013class vrRotation
    1114{
     
    2831    float getAngle() const;
    2932
     33    vrQuaternion getQuaternion() const;
     34
    3035    void set(float x, float y, float z, float angle);
    31     void set(const vrVector3f &vec1, const vrVector3f &vec2);
     36    void set(const vrVector3f& vec1, const vrVector3f& vec2);
    3237    void set(const vrQuaternion& quat);
    3338    void set(const vrRotation& rot);
    3439    void setAxis(float x, float y, float z);
    3540    void setAngle(float angle);
    36        
     41
    3742    friend bool operator!=(const vrRotation& rot1, const vrRotation& rot2);
    3843    friend bool operator==(const vrRotation& rot1, const vrRotation& rot2);
  • trunk/packages/vizservers/nanovis/vrmath/vrMatrix4x4f.cpp

    r2840 r2842  
    77{
    88    _data[1] = _data[2] = _data[3] = _data[4] =
    9         _data[6] = _data[7] = _data[8] = _data[9] =
    10         _data[11] = _data[12] = _data[13] = _data[14] = 0.0f;
     9        _data[6] = _data[7] = _data[8] = _data[9] =
     10        _data[11] = _data[12] = _data[13] = _data[14] = 0.0f;
    1111    _data[0] = _data[5] = _data[10] = _data[15] = 1.0f;
    1212}
     
    1515{
    1616    _data[1] = _data[2] = _data[3] = _data[4] =
    17         _data[6] = _data[7] = _data[8] = _data[9] =
    18         _data[11] = 0.0f;
     17        _data[6] = _data[7] = _data[8] = _data[9] =
     18        _data[11] = 0.0f;
    1919    _data[0] = _data[5] = _data[10] = _data[15] = 1.0f;
    2020    _data[12] = translation.x;
     
    2626{
    2727    _data[1] = _data[2] = _data[3] = _data[4] =
    28         _data[6] = _data[7] = _data[8] = _data[9] =
    29         _data[11] = 0.0f;
     28        _data[6] = _data[7] = _data[8] = _data[9] =
     29        _data[11] = 0.0f;
    3030    _data[0] = _data[5] = _data[10] = _data[15] = 1.0f;
    3131    _data[12] = x;
     
    3636void vrMatrix4x4f::makeRotation(const vrRotation& rotation)
    3737{
    38     if (rotation.getX() == 0.0f && rotation.getY() == 0.0f && rotation.getZ() == 0.0f) {
     38    if (rotation.getAngle() == 0.0f ||
     39        (rotation.getX() == 0.0f &&
     40         rotation.getY() == 0.0f &&
     41         rotation.getZ() == 0.0f)) {
    3942        makeIdentity();
    4043        return;
     
    4245
    4346    float xAxis = rotation.getX(), yAxis = rotation.getY(), zAxis = rotation.getZ();
    44     float invLen = 1.0f / sqrt( xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
     47    float invLen = 1.0f / sqrt(xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
    4548    float cosine = cos(rotation.getAngle());
    4649    float sine = sin(rotation.getAngle());
     
    7073void vrMatrix4x4f::makeRotation(float xAxis, float yAxis, float zAxis, float angle)
    7174{
    72     if (xAxis == 0.0f && yAxis == 0.0f && zAxis == 0.0f) {
     75    if (angle == 0.0f ||
     76        (xAxis == 0.0f &&
     77         yAxis == 0.0f &&
     78         zAxis == 0.0f)) {
    7379        makeIdentity();
    7480        return;
    7581    }
    7682
    77     float invLen = 1.0f / sqrt( xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
     83    float invLen = 1.0f / sqrt(xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
    7884    float cosine = cos(angle);
    7985    float sine = sin(angle);
     
    101107}
    102108
    103 
    104109void vrMatrix4x4f::makeScale(const vrVector3f& scale)
    105110{
    106111    _data[1] = _data[2] = _data[3] = _data[4] =
    107         _data[6] = _data[7] = _data[8] = _data[9] =
    108         _data[11] = 0.0f;
     112        _data[6] = _data[7] = _data[8] = _data[9] =
     113        _data[11] = 0.0f;
    109114
    110115    _data[0] = scale.x;
     
    119124{
    120125    float mat[16];
    121     float* mat1 = (float*) m1._data;
     126    float *mat1 = (float *)m1._data;
    122127
    123128    // 1 row
     
    169174{
    170175    float mat[16];
    171     float* mat1 = (float*) m1._data;
    172     float* mat2 = (float*) m2._data;
     176    float *mat1 = (float *)m1._data;
     177    float *mat2 = (float *)m2._data;
    173178
    174179    // 1 row
     
    218223void vrMatrix4x4f::multiplyFast(const vrMatrix4x4f& m1, const vrMatrix4x4f& m2)
    219224{
    220     float* mat1 = (float*) m1._data;
    221     float* mat2 = (float*) m2._data;
     225    float *mat1 = (float *)m1._data;
     226    float *mat2 = (float *)m2._data;
    222227
    223228    // 1 row
     
    284289
    285290void vrMatrix4x4f::invert()
    286 
    287291{
    288292    float det =
     
    432436}
    433437
    434 
    435 
    436438void vrMatrix4x4f::invert(const vrMatrix4x4f& mat)
    437439{
    438     float* data = (float*) mat._data;
     440    float *data = (float *)mat._data;
    439441
    440442    float det =
     
    586588void vrMatrix4x4f::invertFast(const vrMatrix4x4f& mat)
    587589{
    588     float* srcData = (float*) mat._data;
     590    float *srcData = (float *)mat._data;
    589591
    590592    float det =
     
    810812{
    811813    for (int i = 0; i < 16; ++i) {
    812         _data[i] = (float) m[i];
     814        _data[i] = (float)m[i];
    813815    }
    814816}
  • trunk/packages/vizservers/nanovis/vrmath/vrRotation.cpp

    r2840 r2842  
    11/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
     2#include <math.h>
     3
    24#include <vrmath/vrRotation.h>
    35#include <vrmath/vrVector3f.h>
     
    1719    cross.cross(vec1, vec2);
    1820
    19     float ang = atan2( cross.length(), vec1.dot(vec2) );
     21    float ang = atan2(cross.length(), vec1.dot(vec2));
    2022
    2123    cross.normalize();
     
    3335    angle = acos(quat.w) * 2.0f;
    3436    float scale = sqrt(1 - quat.w * quat.w);
    35     if (scale < 0.001) {
     37    if (angle < 1.0e-6f) {
     38        x = 1;
     39        y = 0;
     40        z = 0;
     41    } else if (scale < 1.0e-6f) {
    3642        x = quat.x;
    3743        y = quat.y;
     
    4248        z = quat.z / scale;
    4349    }
    44     /*
    45     // http://gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation#Quaternion_to_axis-angle
    46     float scale = sqrt(quat.x * quat.x + quat.y * quat.y + quat.z * quat.z);
    47     x = quat.x / scale;
    48     y = quat.y / scale;
    49     z = quat.z / scale;
    50     */
    5150}
     51
     52vrQuaternion vrRotation::getQuaternion() const
     53{
     54    vrQuaternion result;
     55
     56    result.w = cos(angle / 2.0);
     57    double sinHalfAngle = sin(angle / 2.0);
     58    result.x = x * sinHalfAngle;
     59    result.y = y * sinHalfAngle;
     60    result.z = z * sinHalfAngle;
     61
     62    return result;
     63}
Note: See TracChangeset for help on using the changeset viewer.