- Home /
3D Orbital Camera issue
I'm working on creating a 3D orbital camera for my player character (i.e. it moves on a spherical path around the model) and I understand the principal behind converting spherical coordinates to Cartesian coords, but for some reason I'm getting weird behavior in the actual movement.
if (Input.GetMouseButtonDown(1))
{
MouseX = Input.mousePosition.x;
MouseY = Input.mousePosition.y;
}
if (Input.GetMouseButton(1))
{
if (Input.mousePosition.x - MouseX > 0)
{
phi += CameraMoveSpeed * Mathf.PI / 180;
}
else if (Input.mousePosition.x - MouseX < 0)
{
phi -= CameraMoveSpeed * Mathf.PI / 180;
}
if (Input.mousePosition.y - MouseY > 0)
{
theta += CameraMoveSpeed * Mathf.PI / 180;
}
else if (Input.mousePosition.y - MouseY < 0)
{
theta -= CameraMoveSpeed * Mathf.PI / 180;
}
}
Vector3 target = new Vector3(transform.position.x, transform.position.y + 10, transform.position.z - 10);
target.x = transform.position.x + CameraDistance * Mathf.Cos(phi) * Mathf.Sin(theta);
target.y = transform.position.y + CameraDistance * Mathf.Sin(phi) * Mathf.Sin(theta);
target.z = transform.position.z + CameraDistance * Mathf.Cos(theta);
mainCam.transform.position = target;
I'm not sure where I'm going wrong.
Answer by gchandel · Mar 30, 2016 at 04:09 PM
Ok, I've figured it out!
I ended up finding a project from my computer graphics course that had the answer.
if (Input.GetMouseButtonDown(1))
{
MouseX = Input.mousePosition.x;
MouseY = Input.mousePosition.y;
}
if (Input.GetMouseButton(1))
{
if (Input.mousePosition.x - MouseX > CameraMouseThreshhold)
{
theta += CameraMoveSpeed;
}
else if (Input.mousePosition.x - MouseX < -CameraMouseThreshhold)
{
theta -= CameraMoveSpeed;
}
if (Input.mousePosition.y - MouseY > CameraMouseThreshhold)
{
phi += CameraMoveSpeed;
}
else if (Input.mousePosition.y - MouseY < -CameraMouseThreshhold)
{
phi -= CameraMoveSpeed;
}
}
target.x = transform.position.x + CameraDistance * Mathf.Sin(theta * Mathf.Deg2Rad) * Mathf.Sin(phi * Mathf.Deg2Rad);
target.z = transform.position.z + CameraDistance * Mathf.Cos(theta * Mathf.Deg2Rad) * Mathf.Sin(phi * Mathf.Deg2Rad);
target.y = transform.position.y + CameraDistance * Mathf.Cos(phi * Mathf.Deg2Rad);
mainCam.transform.position = Vector3.Lerp(mainCam.transform.position, target, 5f * Time.deltaTime);
mainCam.transform.LookAt(transform);
The key was getting the right Cartesian coordinate conversions mapped to the correct transform position vector units.
Your answer
Follow this Question
Related Questions
ConfigurableJoint for Third-Person Camera? 0 Answers
Smooth camera shift, Lerp? SmoothShift? 2 Answers
Camera movement in a Third Person Shooter Game 2 Answers