Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> взаимодействие игрока с 3D миром, ? DirectX 
:(
    Опции темы
Div
  Дата 3.7.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 3.6.2005
Где: Первоуральск

Репутация: 1
Всего: 1



При создании простенькой 3D игры, я наткнулся на проблемму со взаимодействием игрока с окружаещим миром. У меня вырисовывается комната, в которой стоит мебель нарисованная в 4D Cinema. Клавишами управления можно поворачивать камеру по оси X. По RND ставиться бутылочка на верхние плоскости от мебели. Так же я использую стандартный виндовозный курсор. Вот как можно определить - находиться ли бутылочка под курсором или нет?
PM MAIL WWW ICQ   Вверх
Dubinsky
Дата 4.7.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Ну можно в Бэк буфере рисовать только то что можно выбрать причём всё разными цветами , а освещение настроить без теней (для бэк буфера), потом смотрим какого цвета пиксел в этом буфере (буфер не выводим на экран ) и зная цвет , знаем объект , однако мне такой способ не очень ...

по крайней мере я так делал в Опен ЖеЛе и Директе 3Д, смысл везде был похожий
PM MAIL WWW   Вверх
Div
Дата 4.7.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 3.6.2005
Где: Первоуральск

Репутация: 1
Всего: 1



Спасибо за идею, но это получается всё очень тормознуто! У меня очень много предметов.
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 4.7.2005, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Цитата(Dubinsky @ 4.7.2005, 13:07)
Ну можно в Бэк буфере рисовать только то что можно выбрать причём всё разными цветами , а освещение настроить без теней (для бэк буфера), потом смотрим какого цвета пиксел в этом буфере (буфер не выводим на экран ) и зная цвет , знаем объект , однако мне такой способ не очень ...

по крайней мере я так делал в Опен ЖеЛе и Директе 3Д, смысл везде был похожий
Причем здесь можно задать вьюпорт так, чтобы он был минимальным, чтобы не было лишних перерисовок.

Как вариант - ray tracing...



--------------------
С уважением, г-н Посол.
PM   Вверх
Div
Дата 5.7.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 3.6.2005
Где: Первоуральск

Репутация: 1
Всего: 1



Цитата
Причем здесь можно задать вьюпорт так, чтобы он был минимальным, чтобы не было лишних перерисовок.

А как это сделать? Пожете подкинуть код? Буду очень благодарен!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 5.7.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



В общем-то я это делал давным-давно smile и на OpenGL... Могу только сказать, что делалось это с помощью gluPickMatrix... Аналогично можно задать матрицу и в D3D - как, поищи сам...



--------------------
С уважением, г-н Посол.
PM   Вверх
Div
Дата 6.7.2005, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 3.6.2005
Где: Первоуральск

Репутация: 1
Всего: 1



Ничего подобного в DirectX я не нашел! Может быть плохо искал, не знаю!

Dubinsky
Можешь подкинуть код своего примера (только для DirectX). Я посмотрю, что, да как...
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 6.7.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Цитата
Ничего подобного в DirectX я не нашел! Может быть плохо искал, не знаю!
Да... На самом деле я тоже щас посмотрел, не нашел никаких подобных D3DXMatrix*-функций... Ну можно было тогда просто посмотреть, какую матрицу формирует gluPickMatrix, и самому её формировать smile.
Немного повызывав gluPickMatrix, эспериментально определил формулы матрицы (они простые):
Код

Pick-матрица:
a 0 0 0
0 b 0 0
0 0 1 0
c d 0 1

Где:    
a = vp_w / pr_w
b = vp_h / pr_h

    vp_w - 2*(pr_x - vp_x)
c = ----------------------
             pr_w

    vp_h - 2*(pr_y - vp_y)
d = ----------------------
             pr_h

Где:
vp_x, vp_y - координаты левого верхнего угла viewport'а в пикселах (обычно = 0)
vp_w, vp_h - ширина и высота viewport'а в пикселах
pr_x, pr_y - координаты центра выбираемой области (picking rectangle), в пикселах
pr_w, pr_y - ширина и высота выбираемой области


Как это использовать ?

Например, было у тебя примерно так:
Код

D3DXMATRIX your_projection_matrix;
D3DXMatrixPerspectiveFovLH( &your_projection_matrix, ... );
d3ddev->SetTransform( D3DTS_PROJECTION, &your_projection_matrix );

D3DVIEWPORTx vp;
vp.X = 0;
vp.Y = 0;
vp.Width = 800; 
vp.Height = 600;
vp.MinZ = ...; vp.MaxZ = ...;
d3ddev->SetViewport( &vp );

// какое-либо рисование сцены

Теперь нужно определить, какой объект нарисованной сцены находится под курсором:
Код

pr_x = ...; // координаты мышиного курсора относительно сурфейса
pr_y = ...; // 
pr_w = 1; // просматриваем область 1x1
pr_h = 1;
vp_w = 800; // это ширина и высота оригинального вьюпорта
vp_h = 600; 

// создаём pick-матрицу
D3DXMATRIX PickMatrix;
D3DXMatrixIdentity( &PickMatrix );
PickMatrix._11 = vp_w / pr_w;
PickMatrix._22 = vp_h / pr_h;
PickMatrix._41 = (vp_w - 2*pr_x)/pr_w;
PickMatrix._42 = (vp_h - 2*pr_y)/pr_h;

// настройка матрицы проекции
d3ddev->SetTransform( D3DTS_PROJECTION, &PickMatrix );
d3ddev->MultiplyTransform( D3DTS_PROJECTION, &your_projection_matrix );

// настройка вьюпорта, рендерим только 1 пиксел
D3DVIEWPORTx vp1;
vp1.X = 0; // (можно где угодно рендерить, возьмем левый-верхний угол поверхности)
vp1.Y = 0;
vp1.Width = pr_w;
vp1.Height = pr_h;
vp1.MinZ = ...; vp1.MaxZ = ...;
d3ddev->SetViewport( &vp1 );

// теперь рисуем без всяких наворотов только те объекты сцены, которые можно выбрать курсором
// при этом каждый объект рисуется однотонным уникальным цветом
// запоминаем любым образом соответствие: цвет <-> объект
...

// теперь смотрим, что находися в самом верхнем-левом пикселе отрендеренной картинки (например, через LockRect)
// и определяем, какому объекту соответствует цвет пикселя




--------------------
С уважением, г-н Посол.
PM   Вверх
Div
Дата 11.7.2005, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 3.6.2005
Где: Первоуральск

Репутация: 1
Всего: 1



Попробовал вставить этот код в свой, и получилась такая херь: все моргает, в верхнем левом углу выводиться один пиксель, при перемещении мышки он изменяет цвет, если отвести курсор ниже 1/4 экрана, то этот пиксель всегда черный.
Пробовал вставить пол кода в инициализацию. Тогда перемещения курсора вообще не обрабатываются, но перестаёт моргать экран.
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 12.7.2005, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Моргает потому что выводишь нарисованный пиксел на экран. Не выводи его, рисуй просто в BackBuffer'е... Получай цвет пиксела, и рисуй опять же в бэкбуфере следующий нормальный кадр. Потом уже только делай флип (Present).
Цитата(Div @ 11.7.2005, 21:17)
отвести курсор ниже 1/4 экрана, то этот пиксель всегда черный.
А размер сурфейса у тебя какой (на котором рисуется сцена) ? И разрешение экрана ?
Добавлено @ 07:17
В инициализацию вставлять не надо


--------------------
С уважением, г-н Посол.
PM   Вверх
Div
Дата 12.7.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 3.6.2005
Где: Первоуральск

Репутация: 1
Всего: 1



Сурфейс и разрешение одинаковые: 800x600x32 70Hz
Добавлено @ 16:46
Можете подкинуть полный код? Чего-то я понять не могу. smile
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.