From Tom Jolley, Added a new enum POINT_ROT_WORLD_Z_AXIS and a new section in computeMatrix for this enum.

With a small tweak from Robert Osfield to set _cacheMode.
This commit is contained in:
Robert Osfield 2004-10-28 13:26:06 +00:00
parent 013c963a6b
commit fd327f68f6
2 changed files with 30 additions and 0 deletions

View File

@ -112,6 +112,7 @@ class SG_EXPORT Billboard : public Geode
AXIAL_ROT_X_AXIS=AXIAL_ROT+1, AXIAL_ROT_X_AXIS=AXIAL_ROT+1,
AXIAL_ROT_Y_AXIS, AXIAL_ROT_Y_AXIS,
AXIAL_ROT_Z_AXIS, AXIAL_ROT_Z_AXIS,
POINT_ROT_WORLD_Z_AXIS,
CACHE_DIRTY CACHE_DIRTY
}; };

View File

@ -70,6 +70,12 @@ void Billboard::updateCache()
else if (_axis==Vec3(0.0f,0.0,1.0f) && _normal==Vec3(0.0f,-1.0,0.0f)) _cachedMode = AXIAL_ROT_Z_AXIS; else if (_axis==Vec3(0.0f,0.0,1.0f) && _normal==Vec3(0.0f,-1.0,0.0f)) _cachedMode = AXIAL_ROT_Z_AXIS;
else _cachedMode = AXIAL_ROT; else _cachedMode = AXIAL_ROT;
} }
else if( _mode == POINT_ROT_WORLD )
{
if(_axis==Vec3(0.0f, 0.0, 1.0f) && _normal==Vec3(0.0f, -1.0f, 0.0f)) _cachedMode = POINT_ROT_WORLD_Z_AXIS;
else _cachedMode = _mode;
}
else _cachedMode = _mode; else _cachedMode = _mode;
_side = _axis^_normal; _side = _axis^_normal;
@ -226,6 +232,29 @@ bool Billboard::computeMatrix(Matrix& modelview, const Vec3& eye_local, const Ve
} }
break; break;
} }
case(POINT_ROT_WORLD_Z_AXIS):
{
// float rotation_about_z = atan2( -ev.y(), ev.x() );
// float xy_distance = sqrt( ev.x()*ev.x() + ev.y()*ev.y() );
// float rotation_from_xy = atan2( xy_distance, -ev.z() );
Vec2 about_z( -ev.y(), ev.x() );
if( about_z.normalize() == 0.0f ) about_z.x() = 1.0f;
float xy_distance = sqrt( ev.x()*ev.x() + ev.y()*ev.y() );
Vec2 from_xy( xy_distance, -ev.z() );
if( from_xy.normalize() == 0.0f ) from_xy.x() = 1.0f;
matrix(0,0) = about_z.x();
matrix(0,1) = about_z.y();
matrix(1,0) = -about_z.y()*from_xy.x();
matrix(1,1) = about_z.x()*from_xy.x();
matrix(1,2) = from_xy.y();
matrix(2,0) = about_z.y()*from_xy.y();
matrix(2,1) = -about_z.x()*from_xy.y();
matrix(2,2) = from_xy.x();
break;
}
} }
matrix.setTrans(pos_local); matrix.setTrans(pos_local);