In the game, we often have this action, click a location in the scene, the character automatically moved to that position, while the character has been moving towards that position, and the camera will always follow the character movement. Some games, the mouse slide screen, the camera will revolve around the character. Seemingly very simple operation, then how exactly is the implementation of it? Let's break down these operations into the following steps
the movement of a character1. Move to the next route point, linear interpolation, curve interpolation 2. Character facing, always facing the next road.
Camera Follow character1. The camera overlooks the angle and determines the height of the camera 2. Camera follow distance, forward distance or straight line distance (that is, the triangular horizontal side length or hypotenuse length) 3. The camera always looks at the back of the character (the y-axis rotation angle is consistent with the character) 4. Camera rotation around the role of technical points: 1. Vector 2. Rotation first look at the effect, please forgive me not registered screen video Orz
role MoveThis includes displacement and direction, which is where the character moves in the same direction as the moving character. The diagram on the left, where the character moves from A to B, is facing forward and is clearly inconsistent with the running display logic. The correct performance is shown on the right side of the image, the character faces moving direction. So what do we have to do to achieve this effect? The displacements are simple, and the coordinates of A to B are interpolated. followed by a rotating character, unity provides a way
quaternion.lookrotation。 The official explanation for this method is as follows: Quaternion.lookrotation gaze rotation
static function lookrotation (Forward:vector3, Upwards:vector3 = vector3.up): quaterniondescription description CRE Ates a rotation that looks along forward with the the the head upwards along upwards create a rotation along the forward (z-axis) and head along the upwards (y-axis) of the constraint gaze 。 That is, create a rotation so that the z -axis faces the viewif is zero. If the forward direction is 0, an error is logged.
It is not difficult to understand the description of light. There are a lot of explanations for this method on the Internet, but there are a few simple and clear statements that are more misleading.
We know the vectors, which contain the size and direction. Size is easy to get, so how do you get directions? Conventionally, the vector can be divided into X, Y, z three components, and then the trigonometric functions in order to obtain the angle of a component. Unity provides an easier way to
Quaternion.lookrotation,This method is to get the direction of the incoming vector, that is, the rotation value, is a four-dollar number. The code is actually very simple, just a few lines. The main reason is to understand why
1 //A vector that calculates the current position to the next coordinate point2 varVector = (PosB-PosA). normalized;3 //get the direction of the vector4 varrotation =quaternion.lookrotation (vector). Eulerangles;5 //rotates the object to the direction of the next coordinate point6Transform.rotation = Quaternion.euler (0, ROTATION.Y,0);7 //set the coordinates of an object8Transform.position = PosB;
Think about why Quaternion.euler (0, ROTATION.Y, 0) Here the X and z directions are all filled 0? Because the direction of the character is based on the deflection angle yaw, which is determined by the Y axis, the x and Z axes are not deflected, if you change the z axis rotation value of the x axis, you will find that the character will have pitch, tumbling effect.
Camera Follow characterWell, the direction of the character has been solved. So, what if I want the camera to go along with the character, and the camera always sees the back of the character, that is, when the character spins, the camera rotates and stays at a fixed distance? We first calculate the position of the camera and then turn the camera toward the back of the character. 1. Calculate the camera rotation value, here you need to specify the camera's pitch angle pitch value, assumed to be 30 degrees, can be adjusted according to the specific situation
// camera pitch and yaw angle, Y-direction yaw and target object consistent 0);
2. Calculate the vector of the specified length distance, which is parallel to the world coordinate Z direction
var vector = Vector3.forward * Distance;
3. Use the above camera rotation value to the left by the second step to get the vector, change the direction of the vector (four number of left multiplication vector, change the direction of the vector)
Vector = ro * vector;
4. Use the target position minus the vector to get the coordinate point pointing to the target position, which is the final position of the camera. (Why do you get the position, go back to the knowledge of the vector?)
var pos = transform.position-vector;
5. Finally, the rotation value and coordinates are assigned to the camera, the camera completes the follow effect, is not very simple
CameraGo.transform.position == ro;
1 // The camera's pitch and yaw angles, Y-direction yaw and target object are consistent 2 quaternion ro = Quaternion.euler (Pitch, Transform.rotation.eulerangles.y, 0 3 // Give vector rotation 4 var distancevector = ro * Vector3.forward * Distance; 5 var pos = transform.position- Distancevector; 6 CameraGo.transform.position = POS; 7 CameraGo.transform.rotation = ro;
As for the camera rotation around the character, we just need to change the Quaternion.euler (Pitch, transform.rotation.eulerangles.y, 0) The value in Transform.rotation.eulerangles.y this value is the direction of the specified camera toward the character, we change this value, we can achieve the effect of the camera around the role. We can do this.
// The delta is the rotation angle 0~360 around the character rotation.
0)
Finally, the appeal code is as follows, the code is not complete, please fill in your own:
1 //role Move2 voidSmoothmove ()3 {4vector3[] Vector3s = _transdatalist;//Curvepath.pathcontrolpointgenerator (_transdatalist);5 intSample = _transdatalist.length *samplerate;6 7_MOVEPTG + = Time.deltatime *Movespeed;8 9 //curve interpolationTenTransform.position = Curvepath.interp (vector3s, _MOVEPTG/sample); One A //A vector that calculates the current position to the next coordinate point - varVector = (Transform.position-_prevpos). normalized; - //get the direction of the vector the varrotation =quaternion.lookrotation (vector, vector3.right). Eulerangles; - //the effect of the place X and z direction, only the Y-direction deflection -Rotation.x =0; -Rotation.z =0; + - //rotates the object to the direction of the next coordinate point +Transform.rotation =Quaternion.euler (rotation); A at -_prevpos =transform.position; - if(_MOVEPTG >=sample) - { - Resetlocaldata (); - } in } - to //Camera Follow + voidFollowcamera () - { the if(Camerago = =NULL)return; * $ if(Usefollow! =0)Panax Notoginseng { - //camera pitch and yaw angle, Y-direction yaw and target object consistent thequaternion ro = Quaternion.euler (Pitch, Transform.rotation.eulerangles.y + Slider,0); + A //give a rotation to a vector the varDistancevector = ro * Vector3.forward *Distance; + varpos = transform.position-Distancevector; -CameraGo.transform.position =Pos; $CameraGo.transform.rotation =ro; $ return; - } -}
Unity3d: Game decomposition of character movement and camera follow