|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
23.12.2007, 00:07
|
#1
|
Модератор
Регистрация: 21.12.2006
Сообщений: 564
Написано 79 полезных сообщений (для 203 пользователей)
|
3D в 2D
Это не регрессия...
Просто есть точка с координатами (x;y;z) надо ее нарисовать на экране(он ясное дело 2д). как это сделать чтобы эти координаты были проэкцией точки на плоскость.
|
(Offline)
|
|
23.12.2007, 00:23
|
#2
|
Модератор
Регистрация: 21.12.2006
Сообщений: 564
Написано 79 полезных сообщений (для 203 пользователей)
|
Re: 3D в 2D
а тперь вопрос посложнее: как применить это с учетом позиции камеры?
|
(Offline)
|
|
23.12.2007, 00:42
|
#3
|
Бывалый
Регистрация: 09.09.2006
Сообщений: 656
Написано 54 полезных сообщений (для 110 пользователей)
|
Re: 3D в 2D
А ты в Блитце делаешь ?
если да то там есть свои фичи типо каманд
CameraProject
ProjectedX()
ProjectedY()
|
(Offline)
|
|
23.12.2007, 00:58
|
#4
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: 3D в 2D
|
(Offline)
|
|
23.12.2007, 01:03
|
#5
|
Модератор
Регистрация: 21.12.2006
Сообщений: 564
Написано 79 полезных сообщений (для 203 пользователей)
|
Re: 3D в 2D
А если математикой - отнимаем от координат обьекта координаты камеры. Если с поворотами - то там еще чуток тригонометрии
|
ты меня тригонометрией не пугай Я ее и на уравнениях и на неровностях побеждаю
и пиши смысловые сообщения, а не чтобы показатся умным
|
(Offline)
|
|
23.12.2007, 02:11
|
#6
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.12.2007, 16:20
|
#7
|
Модератор
Регистрация: 21.12.2006
Сообщений: 564
Написано 79 полезных сообщений (для 203 пользователей)
|
Re: 3D в 2D
Cyan
попробую. спасибо..
|
(Offline)
|
|
24.12.2007, 02:18
|
#8
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: 3D в 2D
CenterX = ScreenWidth Shr 1
CenterY = ScreenHeight Shr 1
|
маньяк!
|
(Offline)
|
|
24.12.2007, 02:28
|
#9
|
Модератор
Регистрация: 21.12.2006
Сообщений: 564
Написано 79 полезных сообщений (для 203 пользователей)
|
Re: 3D в 2D
А что такое?
Эта функция производит двоичный сдвиг числа вправо указанное количество раз. Это более быстрый метод деления числа экспоненциально. Одним сдвигом вправо вы делите число на 2. Двумя сдвигами вы делите число на 4 и т.д.
Полезность этой команды заключается в более быстром математическом выполнении расчетов.
|
Он видимо просто код копирнул... Но я еще не пробовал. Завтра заценю.
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 200 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.
|
|
(Offline)
|
|
24.12.2007, 02:33
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: 3D в 2D
dector, козе понятно , что ето деление на два целочисленного числа.
другое дело - зачем?
ну съекономит он пару тактов на ОДИН запуск программы.
|
(Offline)
|
|
24.12.2007, 02:39
|
#11
|
Модератор
Регистрация: 21.12.2006
Сообщений: 564
Написано 79 полезных сообщений (для 203 пользователей)
|
Re: 3D в 2D
Ну в принципе согласен. Не спорю .
ПРосто для таких как я выдержку из хелпа привел). Думаю если кто заглянет - чтобы не спрашивали что это такое.
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 200 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.
|
|
(Offline)
|
|
24.12.2007, 12:53
|
#12
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Re: 3D в 2D
Сообщение от HolyDel
другое дело - зачем?
|
Привычка. Причем весьма полезная
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:23.
|