Цитата(Elfet @ 19.6.2007, 23:56 ) | | Кажется нашёл smile Камуру нельзя назад развернуть почемуто smile Всем спасибо! |
Не, это вся нормально работает :/
Почему то я не могу разместить камеру в отрицательном положении - вот в этом глюк.
Вот как у меня вся работает: Есть класс Camera с методом ResetCameraCoordinates()
| Код | public void ResetCameraCoordinates() { n = My3D.Constans.I; u = My3D.Constans.K; v = My3D.Constans.J;
if (look.X == 0 && look.Y != 0) Pitch((look.Y > 0) ? Math.PI / 2 : -Math.PI / 2); else if (look.X != 0 && look.Y != 0) Pitch(Math.Atan(look.Y / look.X)); // вращаем орты камеры
if (look.X == 0 && look.Y == 0 && look.Z != 0) Yaw((look.Z > 0) ? Math.PI / 2 : -Math.PI / 2); else if ((look.X != 0 || look.Y != 0) && look.Z != 0) Yaw(Math.Atan(look.Z / Math.Sqrt(look.X * look.X + look.Y * look.Y)));
if (rotationAngle != 0) Roll(rotationAngle * Math.PI / 180);
viewMatrix = new MyMatrix(new float[4, 4] // матрица моделирования вида { {n.X, n.Y, n.Z, Vector.ScalarProduct(-eye, n)}, {v.X, v.Y, v.Z, Vector.ScalarProduct(-eye, v)}, {u.X, u.Y, u.Z, Vector.ScalarProduct(-eye, u)}, {0, 0, 0, 0} }); }
|
Который позиционирует координаты камеры по заданным параметрам и создаёт матрицу моделирования вида.
И есть функция Paint которая умножает все точки треугольников на матрицу моделирования вида и рисует эти треугольники.
| Код | public void Paint(Graphics graph, float sx, float sy) { List<Trians2Draw> buff = new List<Trians2Draw>();
foreach (Camera camera in camers) foreach (Triangle[] triangles in trianglesBase.Values) // { // foreach (Triangle trian in triangles) // проходим циклом по всем треугольникам { bool visable = true;
PointF[] points = new PointF[3];
float depth = 0;
for (int i = 0; i < 3; i++) { Vector view = MyMatrix.MatrixMultiplication(camera.ViewMatrix, MyMatrix.Transposition(GetMatrixFromVector(trian[i]))); // Умножаем матрицу моделирования вида на точку и получаем новую точку
if (view.X > camera.ProjectionDistance) { points[i] = new PointF(sx * camera.ProjectionDistance * view.Y / view.X, sy * camera.ProjectionDistance * view.Z / view.X); // получаем проекцию точки depth += 1 / view.X; } else { visable = false; break; } }
if (visable) { depth /= 3; buff.Add(new Trians2Draw(depth, points, trian.Color)); // А как насчёт такой вот глубины? - (101 * depth + 200) / (99 * depth) } } }
buff.Sort();
foreach (Trians2Draw triangle in buff) { GraphicsPath path = new GraphicsPath();
path.AddLines(new PointF[4] { triangle.points[0], triangle.points[1], triangle.points[2], triangle.points[0] });
SolidBrush brush = new SolidBrush(triangle.color);
graph.FillPath(brush, path); } }
|
Где может быть ошибка зарыта? |