void Camera::turn(vec3& v1, vec3& v2, float amount) { double cosTheta = std::cos(amount); double sinTheta = std::sin(amount); float vX = cosTheta*v1[0] + sinTheta*v2[0]; float vY = cosTheta*v1[1] + sinTheta*v2[1]; float vZ = cosTheta*v1[2] + sinTheta*v2[2]; float nX = -sinTheta*v1[0] + cosTheta*v2[0]; float nY = -sinTheta*v1[1] + cosTheta*v2[1]; float nZ = -sinTheta*v1[2] + cosTheta*v2[2]; v1.set(vX, vY, vZ); v2.set(nX, nY, nZ); }
bool getPosition(const TiXmlElement *root, vec3 &pos) { bool ok1, ok2, ok3; if (root == NULL) { QTWARNING("The given root is not a Position Element"); return false; } QString rootValue = root->Value(); rootValue = rootValue.stripWhiteSpace(); if (!(rootValue == "position" || rootValue == "orientation")) { QTWARNING("The given root is not a Position Element"); return false; } QString valueStr = root->GetText(); valueStr = valueStr.simplifyWhiteSpace().stripWhiteSpace(); QStringList l; l = QStringList::split(' ', valueStr); if (l.count() != 3) { QTWARNING("Invalid position input"); return false; } double x, y, z; x = l[0].toDouble(&ok1); y = l[1].toDouble(&ok2); z = l[2].toDouble(&ok3); if (!ok1 || !ok2 || !ok3) { QTWARNING("Invalid position input"); return false; } pos.set(x, y, z); return true; }
bool Camera::screenToWorld(int screenX, int screenY, vec3& worldCoords) { double x, y, z; GLint result = gluUnProject(screenX, screenY, 0.0, myModelMatrix, myProjMatrix, myViewport, &x, &y, &z); worldCoords.set(x, y, z); return result == GL_TRUE; }
//-------------------------------------------------------------------------------- // get target look at //-------------------------------------------------------------------------------- bool zz_camera_follow::get_target_dir (vec3& dir) { if (!target_) { dir.set(0, 1, 0); return false; } dir = target_->get_look_at(); dir.normalize(); return true; }
///////////////////////////////////////////////////////////////////// // get the closest point to pt in the primative bool sphere:: closestPtIn ( vec3& dest, ValueType xval, ValueType yval, ValueType zval ) const { if ( isEmpty () ) return false; if ( contains ( xval, yval, zval ) ) dest.set ( xval, yval, zval ); else { dest.set ( xval, yval, zval ); dest -= center; dest.normalize (); dest *= radius; dest += center; } return true; }
void ToIntColour(const vec3<F32>& floatColour, vec3<I32>& colourOut) noexcept { colourOut.set(to_U32(FLOAT_TO_SCHAR_SNORM(floatColour.r)), to_U32(FLOAT_TO_SCHAR_SNORM(floatColour.g)), to_U32(FLOAT_TO_SCHAR_SNORM(floatColour.b))); }
void ToByteColour(const vec3<F32>& floatColour, vec3<U8>& colourOut) noexcept { colourOut.set(FLOAT_TO_CHAR_SNORM(floatColour.r), FLOAT_TO_CHAR_SNORM(floatColour.g), FLOAT_TO_CHAR_SNORM(floatColour.b)); }
void ToFloatColour(const vec3<U32>& uintColour, vec3<F32>& colourOut) noexcept { colourOut.set(uintColour.r / 255.0f, uintColour.g / 255.0f, uintColour.b / 255.0f); }
void ToFloatColour(const vec3<U8>& byteColour, vec3<F32>& colourOut) noexcept { colourOut.set(CHAR_TO_FLOAT_SNORM(byteColour.r), CHAR_TO_FLOAT_SNORM(byteColour.g), CHAR_TO_FLOAT_SNORM(byteColour.b)); }