forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   3D в 2D (http://forum.boolean.name/showthread.php?t=5399)

dector 23.12.2007 00:07

3D в 2D
 
Это не регрессия...

Просто есть точка с координатами (x;y;z) надо ее нарисовать на экране(он ясное дело 2д). как это сделать чтобы эти координаты были проэкцией точки на плоскость.

dector 23.12.2007 00:23

Re: 3D в 2D
 
а тперь вопрос посложнее: как применить это с учетом позиции камеры?

Horror 23.12.2007 00:42

Re: 3D в 2D
 
А ты в Блитце делаешь ?
если да то там есть свои фичи типо каманд
CameraProject
ProjectedX()
ProjectedY()

alcoSHoLiK 23.12.2007 00:58

Re: 3D в 2D
 
Вот тут объясняется, как применяются модельные и видовые преобразования
http://fly.cc.fer.hr/~unreal/theredbook/chapter03.html
А тут просто матрицы проекций.
http://fly.cc.fer.hr/~unreal/theredbook/appendixg.html

dector 23.12.2007 01:03

Re: 3D в 2D
 
Цитата:

А если математикой - отнимаем от координат обьекта координаты камеры. Если с поворотами - то там еще чуток тригонометрии
ты меня тригонометрией не пугай ;) Я ее и на уравнениях и на неровностях побеждаю;)
и пиши смысловые сообщения, а не чтобы показатся умным ;) ;)

Platon 23.12.2007 02:11

Re: 3D в 2D
 
Думаю поймешь из исходника, переписывать алгоритм лень :)
Код:

;Разрешение
ScreenWidth = 800
ScreenHeight = 600

;Центр экрана
CenterX = ScreenWidth Shr 1
CenterY = ScreenHeight Shr 1

;Инициализация графики
Graphics3D(ScreenWidth, ScreenHeight, 32, 2)
SetBuffer(BackBuffer())

;Камера
Camera = CreateCamera()

;Принудительная установка угла фокуса камеры необходима чтобы проекция
;была корректной т.к. узнать его с помощью средств Блица невозможно
Zoom# = 1.2
CameraZoom(Camera, Zoom)

;Проекцируемый объект
Cube = CreateCube()

;Удаление объекта от камеры
Mz = 10
Repeat
       
        ;Вращаем и двигаем камеру чтобы убедиться в корректности проекции
        TurnEntity(Camera, 0.5, 1.2, -2.1)
        MoveEntity(Camera, 1.5, 0.05, 0.4)
       
        ;Получаем экранные координаты
        Mx = MouseX()
        My = MouseY()
        ;Изменяем координату "удаленности" объекта от камеры
        Mz = Mz + MouseZSpeed()
       
        ;############################################
        ;Проецируем экранные координаты в мировые
        Px# = (Mx - CenterX) * Mz / Zoom / CenterX
        Py# = (My - CenterY) * Mz / -Zoom / CenterX
        ;Умножаем координаты (вектор) на матрицу трансформации камеры
        Wx# = GetMatElement(Camera, 0, 0) * Px + GetMatElement(Camera, 1, 0) * Py + GetMatElement(Camera, 2, 0) * Mz + GetMatElement(Camera, 3, 0)
        Wy# = GetMatElement(Camera, 0, 1) * Px + GetMatElement(Camera, 1, 1) * Py + GetMatElement(Camera, 2, 1) * Mz + GetMatElement(Camera, 3, 1)
        Wz# = GetMatElement(Camera, 0, 2) * Px + GetMatElement(Camera, 1, 2) * Py + GetMatElement(Camera, 2, 2) * Mz + GetMatElement(Camera, 3, 2)
        ;Позиционируем объект по полученым координатам
        PositionEntity(Cube, Wx, Wy, Wz)
        ;Поворачиваем объект по углам поворота камеры чтобы убрать влияние ориентации камеры
        RotateEntity(Cube, EntityPitch(Camera), EntityYaw(Camera), EntityRoll(Camera))
        ;############################################
       
        RenderWorld()
        Flip()
Until KeyDown(1)
End


dector 23.12.2007 16:20

Re: 3D в 2D
 
Cyan
попробую. спасибо..

HolyDel 24.12.2007 02:18

Re: 3D в 2D
 
Цитата:

CenterX = ScreenWidth Shr 1
CenterY = ScreenHeight Shr 1
маньяк! ;)

dector 24.12.2007 02:28

Re: 3D в 2D
 
А что такое?

Цитата:

Эта функция производит двоичный сдвиг числа вправо указанное количество раз. Это более быстрый метод деления числа экспоненциально. Одним сдвигом вправо вы делите число на 2. Двумя сдвигами вы делите число на 4 и т.д.

Полезность этой команды заключается в более быстром математическом выполнении расчетов.
:)

Он видимо просто код копирнул... Но я еще не пробовал. Завтра заценю.

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 200 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

HolyDel 24.12.2007 02:33

Re: 3D в 2D
 
dector, козе понятно , что ето деление на два целочисленного числа.
другое дело - зачем?
ну съекономит он пару тактов на ОДИН запуск программы.

dector 24.12.2007 02:39

Re: 3D в 2D
 
Ну в принципе согласен. Не спорю;).
ПРосто для таких как я выдержку из хелпа привел). Думаю если кто заглянет - чтобы не спрашивали что это такое.

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 200 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

Platon 24.12.2007 12:53

Re: 3D в 2D
 

Цитата:

Сообщение от HolyDel
другое дело - зачем?

Привычка. Причем весьма полезная ;)


Часовой пояс GMT +4, время: 15:01.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot