#matrix #3d
#матрица #3D
Вопрос:
Я провожу тест 3D-графики «нетекстурированные кубы на синем экране», используя координаты правой стороны. Однако они получаются странно обрезанными или искаженными (в Orthographic левая сторона дисплея заканчивается раньше, чем окно; в перспективе это выглядит так, как будто дисплей растягивается от заднего левого угла до прямого правого).
Не уверен, в чем проблема на самом деле, но матрицы проекций кажутся хорошим местом для начала.
Те, которые я использую сейчас:
// Went back to where I found it and found out this is a
// left-handed projection. Oops!
public static Matrix4x4 Orthographic(float width, float height,
float near, float far)
{
float farmnear = far - near;
return new Matrix4x4(
2 / width, 0, 0, 0,
0, 2 / height, 0, 0,
0, 0, 1 / farmnear, -near / farmnear,
0, 0, 0, 1
);
}
// Copied from a previous project.
public static Matrix4x4 PerspectiveFov(float fov, float aspect,
float near, float far)
{
float yScale = 1.0F / (float)Math.Tan(fov / 2);
float xScale = yScale / aspect;
float farmnear = far - near;
return new Matrix4x4(
xScale, 0, 0, 0,
0, yScale, 0, 0,
0, 0, far / (farmnear), 1,
0, 0, -near * far / (farmnear), 1
);
}
Спасибо
Комментарии:
1. На что похож ваш конвейер преобразования? Или вы используете какой-нибудь 3D графический API, такой как OpenGL или Direct3D?
2. Я использую SlimDX (по сути, оболочку DirectX для .Net) в качестве серверной части с моей собственной библиотекой поверх. И… Я не уверен, что такое «конвейер преобразования», но вот вставка некоторого соответствующего кода: pastebin.com/3DziVJSV — Я знаю, что это взлом; это ранний тест базовой функциональности.
3. Под «конвейером преобразования» я имел в виду способ преобразования 3D-координат ваших вершин в экранные координаты. Но поскольку вы говорите, что используете Direct3D, это совершенно очевидно.
4. Но помните, если вы используете вершинный шейдер, это зависит от того, как ваш шейдер преобразует вершины.
5. У меня нет шейдера, который я использую в данный момент. Вы видите что-нибудь явно неправильное в моем коде проекции? Работаю над тем, чтобы улучшить свою математику, но это не мгновенный процесс.
Ответ №1:
Решено — Спасибо за всю вашу помощь. Это были не матрицы проекций; это была единственная неправильно размещенная переменная в матрице LookAt / View. Теперь, когда это исправлено, все отображается правильно.
public static Matrix4x4 LookAt(Vector3 eye, Vector3 target, Vector3 up)
{
Vector3 zAxis = target; zAxis.Subtract(ref eye); zAxis.Normalize();
Vector3 xAxis = up; xAxis.Cross(zAxis); xAxis.Normalize();
Vector3 yAxis = zAxis; yAxis.Cross(xAxis);
return new Matrix4x4(
xAxis.X, yAxis.X, zAxis.Z, 0, // There.
xAxis.Y, yAxis.Y, zAxis.Y, 0,
xAxis.Z, yAxis.Z, zAxis.Z, 0,
-xAxis.Dot(eye), -yAxis.Dot(eye), -zAxis.Dot(eye), 1
);
}
Упс. 🙂