core::vector3df IKernelInput::alignToGround(const scene::ISceneNode* Node, scene::ITriangleSelector* Selector) { if(Node && Selector) { core::vector3df Result; core::vector3df Normal; core::triangle3df Triangle; core::matrix4 oldMat; core::matrix4 matRot; core::quaternion quatSource; core::quaternion quatRot; core::quaternion quatTarget; core::vector3df OriginalPosition; core::vector3df Position = Node->getPosition(); core::vector3df Rotation = Node->getRotation(); OriginalPosition = Position; OriginalPosition.Y += 1000; Position.Y = -100; oldMat.setRotationDegrees(Rotation); core::line3d Ray(OriginalPosition, Position); Kernel->CollisionManager->getCollisionPoint(Ray, Selector, Result, Triangle); Normal = Triangle.getNormal(); core::vector3df up(0, 1, 0); oldMat.rotateVect(up); float dot = up.dotProduct(Normal); core::vector3df axis(up.crossProduct(Normal)); quatTarget = core::quaternion(axis.X, axis.Y, axis.Z, 1+dot); quatTarget.normalize(); quatRot.slerp(quatSource, quatTarget, 1.0); core::vector3df newRot; quatRot.toEuler(newRot); newRot *= core::RADTODEG; matRot.setRotationDegrees(newRot); matRot = matRot*oldMat; Rotation = matRot.getRotationDegrees(); return Rotation; } return core::vector3df(0, 0, 0); }