The Untold Engine supports keyboard and mouse actions.
For your reference, the required code to enable keyboard and mouse are implemented in the GameViewController class. Simply make sure that the following method is set to false in the viewDidLoad method in the GameViewController class.
//If using the keyboard, then set it to false. If using a controller then set it to truedirector->setGamePadControllerPresent(false);
Detecting Absolute Mouse Movement
The snippet below shows how you can rotate a character by utilizing the absolute motion of the mouse.
//...other actions here// Action detected on mousecase U4DEngine::mouse:{ //SNIPPET TO USE FOR MOUSE ABSOLUTE POSITIONif(controllerInputMessage.inputElementAction==U4DEngine::mouseActive){ //get the current and previous mouse position U4DEngine::U4DVector3n p1(controllerInputMessage.inputPosition.x,controllerInputMessage.inputPosition.y,0.0); U4DEngine::U4DVector3n p2(controllerInputMessage.previousMousePosition.x,controllerInputMessage.previousMousePosition.y,0.0);
//The following code will compute the correct orientation to rotate the character about an axis.float p1z=1.0-(p1.x*p1.x+p1.y*p1.y);p1.z=p1z>0.0? std::sqrt(p1z) :0.0;float p2z=1.0-(p2.x*p2.x+p2.y*p2.y);p2.z=p2z>0.0? std::sqrt(p2z) :0.0; U4DEngine::U4DVector3n axis; U4DEngine::U4DVector3n mouseDirection=p1-p2;mouseDirection.normalize(); U4DEngine::U4DVector3n upVector(0.0,1.0,0.0); U4DEngine::U4DVector3n xVector(1.0,0.0,0.0); //get the dot productfloat upDot, xDot; upDot=mouseDirection.dot(upVector); xDot=mouseDirection.dot(xVector); U4DEngine::U4DVector3n v=pPlayer->getViewInDirection();v.normalize();if(mouseDirection.magnitude()>0){ //if direction is closest to upvectorif(std::abs(upDot)>=std::abs(xDot)){ //rotate about x axisif(upDot>0.0){ axis=v.cross(upVector); }else{ axis=v.cross(upVector)*-1.0; } }else{ //rotate about y axisif(xDot>0.0){ axis=upVector; }else{ axis=upVector*-1.0; } } //Once we know the angle and axis of rotation, we can rotate the model using interpolation as shown belowfloat angle=p1.angle(p2);float biasAngleAccumulator=0.90; angleAccumulator=angleAccumulator*biasAngleAccumulator+angle*(1.0-biasAngleAccumulator); U4DEngine::U4DQuaternion newOrientation(angleAccumulator,axis); U4DEngine::U4DQuaternion modelOrientation=pPlayer->getAbsoluteSpaceOrientation(); U4DEngine::U4DQuaternion p=modelOrientation.slerp(newOrientation,1.0);pPlayer->rotateBy(p); } }elseif(controllerInputMessage.inputElementAction==U4DEngine::mouseInactive){ }}break;
The illustration below shows the absolute movement of the mouse rotating the charater.
Detecting Relative Mouse Movement
To detect the relative mouse movement, you will need to anchor the mouse in the scene initialization method. To do so, simply calle the setAnchorMouse function as shown below:
void DemoScene::init(){//create view componentdemoWorld=newDemoWorld();//create loading screenloadingScene=newDemoLoading();//create model componentdemoLogic=newDemoLogic();loadComponents(demoWorld, loadingScene, demoLogic);//Anchor the mouse to the screensetAnchorMouse(true);}
The snippet below shows how you can rotate a character by utilizing the relative (delta) motion of the mouse.
//...other actions here// Action detected on mousecase U4DEngine::mouse: {if(controllerInputMessage.inputElementAction==U4DEngine::mouseActiveDelta){ //USE THIS SNIPPET WHEN YOU ONLY WANT THE MOUSE DELTA LOCATION //Get the delta movement of the mouse U4DEngine::U4DVector2n delta=controllerInputMessage.mouseDeltaPosition; //the y delta should be flippeddelta.y*=-1.0; //The following snippet will determine which way to rotate the model depending on the motion of the mousefloat deltaMagnitude=delta.magnitude();delta.normalize(); U4DEngine::U4DVector3n axis; U4DEngine::U4DVector3n mouseDirection(delta.x,delta.y,0.0); U4DEngine::U4DVector3n upVector(0.0,1.0,0.0); U4DEngine::U4DVector3n xVector(1.0,0.0,0.0); //get the dot productfloat upDot, xDot; upDot=mouseDirection.dot(upVector); xDot=mouseDirection.dot(xVector); U4DEngine::U4DVector3n v=pPlayer->getViewInDirection();v.normalize();if(mouseDirection.magnitude()>0){ //if direction is closest to upvectorif(std::abs(upDot)>=std::abs(xDot)){ //rotate about x axis// if(upDot>0.0){// axis=v.cross(upVector);//// }else{// axis=v.cross(upVector)*-1.0;//// } }else{ //rotate about y axisif(xDot>0.0){ axis=upVector; }else{ axis=upVector*-1.0; } } //Once we know the angle and axis of rotation, we can rotate the model using interpolation as shown below
float angle=0.03*deltaMagnitude;float biasAngleAccumulator=0.90; angleAccumulator=angleAccumulator*biasAngleAccumulator+angle*(1.0-biasAngleAccumulator); U4DEngine::U4DQuaternion newOrientation(angleAccumulator,axis); U4DEngine::U4DQuaternion modelOrientation=pPlayer->getAbsoluteSpaceOrientation(); U4DEngine::U4DQuaternion p=modelOrientation.slerp(newOrientation,1.0);pPlayer->rotateBy(p); } }elseif(controllerInputMessage.inputElementAction==U4DEngine::mouseInactive){ //std::cout<<"Mouse stopped"<<std::endl; } }break;
The illustration below shows the relative movement of the mouse rotating the charater.