void Transform::setRotation(glm::quat rot){ assert(!glm::isnan(rot.w) && !glm::isnan(rot.x) && !glm::isnan(rot.y) && !glm::isnan(rot.z)); if (mParent == nullptr || mParent->mGlobalRotationQuat == glm::quat{1,0,0,0}){ // if parent is identity rotation setLocalRotation(rot); } else { quat diff = conjugate(rot) * rotation(); setLocalRotation(mLocalRotationQuat * diff); } }
void Transform::setParent(Transform* transform) { if(this->parent != NULL) { for(int i = 0; i < this->parent->children.size(); i++) { if(this->parent->children.at(i) == this) { this->parent->children.erase(this->parent->children.begin() + i); break; } } } if(transform != NULL) { transform->children.push_back(this); } setLocalPosition(getPosition()); setLocalRotation(getRotation()); this->parent = transform; setPosition(getLocalPosition()); setRotation(getLocalRotation()); }
/*! \brief Convenience function. * */ void TrackSpiralArcSpiral::setLocalStartHeading(double startHeading) { while (startHeading <= -180.0) { startHeading += 360.0; } while (startHeading > 180.0) { startHeading -= 360.0; } // Local to internal (Parameters are given in internal coordinates) // // double deltaHeading(startHeading - heading()); QTransform trafo; trafo.rotate(deltaHeading); pa_->setEndHeadingDeg(pa_->getEndHeadingRad() * 360.0 / (2.0 * M_PI) - deltaHeading); pa_->setEndPoint(trafo.inverted().map(pa_->getEndPoint())); pa_->init(); applyParameters(); // Set local translation // // setLocalRotation(startHeading); }
bool VPathNode::fromString( const String &pString ) { // Split Data. // {Position} {Rotation} {Weight} const char *baseData = StringUnit::getUnit( pString.c_str(), 0, "\t" ); Point3F pos; AngAxisF aa; F32 weight; // Scan Base. dSscanf( baseData, "%g %g %g %g %g %g %g %g", &pos.x, &pos.y, &pos.z, &aa.axis.x, &aa.axis.y, &aa.axis.z, &aa.angle, &weight ); // Apply Changes. setLocalPosition( pos ); setLocalRotation( QuatF( aa ) ); setWeight( weight ); // Fetch Orientation Data. String orientationData = StringUnit::getUnit( pString.c_str(), 1, "\t" ); // Fetch Orientation Type. String orientationTypeString = orientationData; if ( orientationData.find( " " ) ) { // Use First Word. orientationTypeString = orientationData.substr( 0, orientationData.find( " " ) ); } // Set Orientation Type. const eOrientationType &orientationType = getOrientationTypeEnum( orientationTypeString.c_str() ); switch( orientationType ) { case k_OrientationFree : { // Apply Mode. setOrientationMode( orientationType ); } break; case k_OrientationToPoint: { // Fetch Point. Point3F lookAtPoint; // Buffer String. dSscanf( orientationData.c_str(), "%*s %f %f %f", &lookAtPoint.x, &lookAtPoint.y, &lookAtPoint.z ); // Apply Mode. setOrientationMode( orientationType, lookAtPoint ); } break; } return true; }