All pastes #176278 Raw Edit

Unnamed

public text v1 · immutable
#176278 ·published 2006-09-19 15:17 UTC
rendered paste body
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<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);
	}