rendered paste bodycore::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<f32> 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);
}