두 가지 벡터 사이의 각도를 결정하는 데 필요한 여러 가지 방법을 모두 읽었으며 정말 혼란 스럽습니다. 그래서 내가해야 할 일을 이해하는 데 도움이 필요합니다.두 벡터 사이의 요와 피치 결정
다음은 내 첫 인칭 카메라 코드
public class FPSCamera : Engine3DObject
{
public Matrix View { get; private set; }
public Matrix Projeciton { get; private set; }
private Quaternion rotation;
private float yaw;
private float pitch;
private bool isViewDirty;
private bool isRotationDirty;
public BoundingFrustum Frustum { get; private set; }
public bool Changed { get; private set; }
public Vector3 ForwardVector
{
get
{
return this.View.Forward;
}
}
public FPSCamera()
: base()
{
this.Position = Vector3.Zero;
this.rotation = Quaternion.Identity;
this.yaw = this.pitch = 0;
this.isViewDirty = true;
this.isRotationDirty = false;
}
public void SetPosition(Vector3 position)
{
this.Position = position;
this.isViewDirty = true;
this.Update(null);
}
public void Initialize(float aspectRatio)
{
this.Projeciton = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 1f, 1000f);
}
public void Update(GameTime gameTime)
{
this.Changed = false;
if (isRotationDirty)
{
if (yaw > MathHelper.TwoPi)
{
yaw = yaw - MathHelper.TwoPi;
}
if (yaw < -MathHelper.TwoPi)
{
yaw = yaw + MathHelper.TwoPi;
}
if (pitch > MathHelper.TwoPi)
{
pitch = pitch - MathHelper.TwoPi;
}
if (pitch < -MathHelper.TwoPi)
{
pitch = pitch + MathHelper.TwoPi;
}
this.rotation = Quaternion.CreateFromYawPitchRoll(yaw, pitch, 0);
this.isRotationDirty = false;
this.isViewDirty = true;
this.Changed = true;
}
if (isViewDirty)
{
Vector3 up = Vector3.Transform(Vector3.Up, rotation);
Vector3 target = Vector3.Transform(Vector3.Forward, rotation) + Position;
this.View = Matrix.CreateLookAt(this.Position, target, up);
this.isViewDirty = false;
if (this.Frustum == null)
{
this.Frustum = new BoundingFrustum(this.View * this.Projeciton);
}
else
{
this.Frustum.Matrix = (this.View * this.Projeciton);
}
this.Changed = true;
}
}
public void Move(Vector3 distance)
{
this.Position += Vector3.Transform(distance, rotation);
this.isViewDirty = true;
}
public void Rotate(float yaw, float pitch)
{
this.yaw += yaw;
this.pitch += pitch;
this.isRotationDirty = true;
}
public void LookAt(Vector3 lookAt)
{
}
}
은 "바라"방법은 내가 그것을 수행하는 방법을 알아 내려고 노력하고 있기 때문에 빈입니다. 카메라를 움직여서 위치가 (500,500,500)이고 (0, 0, 0)을 볼 필요가 있지만, 회전을 올바르게 설정할 수 있도록 요와 피치를 가져 오는 방법을 알아낼 수 없습니다. 벡터를 정규화하고 십자가 및 점을 사용하는 방법에 대해 읽었습니다. 그러나 방향이 없으므로 (0,0,0)을 정규화 할 수 없으므로 어떻게 해야할지를 놓쳤습니다. 어떤 도움을 주시면 감사하겠습니다.
좋아, 알 겠어 ... 조금 부풀어 오르고 불필요하게 보였으므로 간단하게 생각했다. 구현하고 어떻게 진행되는지 살펴 보겠습니다. – mikelomaxxx14
카메라를 앞으로 (즉, 앞으로 향하는 방향) 어떻게 이동합니까? 현재 모션 벡터를 통과 시키면 카메라가 움직이지만 축의 경우에만 움직이게됩니다. 나는 또한 카메라가 다른 기능을 위해 어떤 각도를 기울이고 있는지를 알아야 할 필요가있다. 그러나 나는 어떻게 든 목표를 사용하여 그것을 할 수 있다고 믿는다. – mikelomaxxx14
이 방법을 추가하여 앞이나 뒤로 이동할 수 있습니다. http://pastebin.com/YPKnM2ye –