В настоящее время я работаю в приложении wpf с камерой Viewport3D
. И я создаю модуль трехмерного прохождения. Я хочу, чтобы мой PerspectiveCamera
двигался в зависимости от направления, в котором он смотрит после изменения направления взгляда. Я использую клавиатуру для управления движением, например: NUMPAD8
: двигаться вперед NUMPAD2
: двигаться назад NUMPAD4
: повернуть влево NUMPAD6
: повернуть вправо
Этот метод ниже предназначен для обнаружения события клавиатуры:
private void button20_KeyDown(Object sender, KeyEventArgs e)
{
if (e.Key == Key.NumPad6)
{
Rotate(1);
}
else if (e.Key == Key.NumPad4)
{
Rotate(-1);
}
else if (e.Key == Key.NumPad8)
{
Move(-10);
}
else if (e.Key == Key.NumPad2)
{
Move(10);
}
}
Это необходимо для расчета вращения:
public void Rotate(double d)
{
double u = 0.05;
double angleD = u * d;
PerspectiveCamera camera = (PerspectiveCamera)Viewport3D.Camera;
Vector3D lookDirection = camera.LookDirection;
double L = lookDirection.Length;
double D = 2 * L * Math.Sin(angleD / 2);
double m = Math.Sqrt(lookDirection.X * lookDirection.X + lookDirection.Y * lookDirection.Y);
double angleA = 2 * Math.Asin(D / (2 * m));
double x = lookDirection.X;
double y = lookDirection.Y;
double angleB = Math.Atan2(y, x);
double angleG = angleB - angleA;
double newx = m * Math.Cos(angleG);
double newy = m * Math.Sin(angleG);
Vector3D NewlookDirection = new Vector3D(newx, newy, lookDirection.Z);
camera.LookDirection = NewlookDirection;
}
Это необходимо для расчета движения камеры:
public void Move(double d)
{
double u = 0.05;
PerspectiveCamera camera = (PerspectiveCamera)Viewport3D.Camera;
Vector3D lookDirection = camera.LookDirection;
Point3D position = camera.Position;
//Point3D NewPosition = new Point3D();
position.Y += d;
//NewPosition.X = position.X + u * lookDirection.X * d;
//NewPosition.Y = position.Y + u * lookDirection.Y * d;
//NewPosition.Z = position.Z + u * lookDirection.Z * d;
//camera.Position = NewPosition;
camera.Position = position;
}
Вычисление вращения работает идеально, но движение кажется некорректным, поскольку оно перемещает камеру в зависимости от положения камеры, а не направления взгляда после поворота.