Выбор 3D объекта мышкой

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Выбор 3D объекта мышкой

Сообщение empty-name » 07.12.2010 (Вт) 22:38

Я хочу реализовать выбор 3д объектов отрендеренных dx8 мышкой. я делаю это таким образом. все объекты учавствующие в этом, имеют код, в диапазоне скажем от 1 до 16 000 000 . вообщем чтобы можно было присвоить каждому свой уникальный цвет. перед рендером самой сцены, рисую так же все объекты, но с выключенным светом, выкл текстурами, и присваиваю каждому объекту соответствующий коду цвет. затем делаю скрин экрана, через GetPixel узнаю код цвета точки на экране, где находится курсор, и это соответственно и будет номер объекта по которому мы кликнули. затем стираю и рисую сцену с нормальными настройками.. но изображение на экране естественно моргает, т.к. показывает то без текстур то с текстурами.. подскажите пожалуйста что можно сделать. желательно без применения сложных геометрических вычислений, всяких коллизий и тп.
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Выбор 3D объекта мышкой

Сообщение Mikle » 07.12.2010 (Вт) 22:54

Вот это метод O_o.
Если рендерить разноцветные объекты в текстуру, а не в бэкбуфер, то моргать не будет, но это всё равно из пушки по воробьям.
Посмотри, например, метод "d3dx.Intersect", все сложные расчёты сделает за тебя D3DX.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Выбор 3D объекта мышкой

Сообщение DirectXManiac » 07.12.2010 (Вт) 23:05

:shock: :shock: Вот это придумал... Типа как на чемпионате мира с вычислением числа PI :lol:
Если пользуешся не D3DXMesh есть метод пересечения луча и треугольника, в интернете много статей да и на форуме можно код найти....
#define ROFL 0xDDDD

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 08.12.2010 (Ср) 1:09

спасибо. у меня используются меши. d3dx.Intersect это интересный способ. надо разобраться. а если рендерить в текстуру, какими методами можно извлечь из нее цвет определенной точки?
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выбор 3D объекта мышкой

Сообщение Хакер » 08.12.2010 (Ср) 14:07

empty-name писал(а):а если рендерить в текстуру, какими методами можно извлечь из нее цвет определенной точки?

Ты так и не понял, что это очень плохой способ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Выбор 3D объекта мышкой

Сообщение djalex777 » 08.12.2010 (Ср) 17:07

Вероятно, человек этот метод вычитал в книге. Сам очень давно натыкался на книгу, описывающую такой метод.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выбор 3D объекта мышкой

Сообщение Хакер » 08.12.2010 (Ср) 17:13

Я сам 6 лет назад использоват такой метод. Правда есть одно но: у меня была отрендеренная на этапе разработки просто картинка с изображением 3d-объектов. Мне нужно было определить, над каким из изображённых 3d-объектов находится указатель мыши, и я использовал вторую картинку с цветами. Соль, как понятно, в том, что никакой информации о геометри самих объектов не было, это была просто картинка, считай, фотография.

В данном же случае сведения о геометрии объектов и их взаиморасположении с камерой есть. И рендерить хит-карту — намного более сложнее с точки зрения измерения вычислительной сложности, чем просто проверить пересечения луча с треугольниками геометрических объектов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Выбор 3D объекта мышкой

Сообщение BV » 08.12.2010 (Ср) 21:10

empty-name писал(а):а если рендерить в текстуру, какими методами можно извлечь из нее цвет определенной точки?

Методом получения пикселей текстуры посредством LockRect
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 09.12.2010 (Чт) 18:14

а как аватарку в свой профиль добавить?)
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Выбор 3D объекта мышкой

Сообщение BV » 09.12.2010 (Чт) 18:50

Личный раздел -> Профиль -> Аватара
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 10.12.2010 (Пт) 16:19

всем спасибо, вы мне очень помогли
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 29.04.2011 (Пт) 17:42

попробовал D3DX.Intersect. Очевидно это самый удобный способ, но мне не удаётся заставить эту функцию заставить работать как надо. Я брал из расчета что проверка на пересечение будет производится в центре экрана, без слежения за мышью. у меня есть координаты камеры и точка куда камера направлена. тоесть я делаю так:

Код: Выделить всё
Dim Lych1 As D3DVECTOR
Dim Lych2 As D3DVECTOR
Dim Peres As Boolean 'флаг определяющий есть пересечение или нет


Lych1 = vec3(Kam(0), Kam(1), Kam(2)) 'здесь соответственно координаты камеры
Lych2 = vec3(Kam(3), Kam(4), Kam(5)) 'здесь точка куда камера смотрит, это всё я вычисляю своими мат расчетами, думаю это ведь не имеет значения

Peres = Mesh_Intersect(Lych1, Lych2)

Function Mesh_Intersect(RayPos As D3DVECTOR, RayDir As D3DVECTOR) As Boolean
Dim RetHit As Long ' устанавливается в 1 если луч пересекает полигон меша
Dim RetU As Single ' U - координата попадания
Dim RetV As Single ' V - координата попадания
Dim RetDist As Single ' расстояние от источника луча до точки пересечения с
' ближайшим полигоном меша
Dim RetFaceIndex as Long ' индекс пересекаемого полигона
Dim CountHits As Long ' количество пересечений полигонов
If Mesh Is Nothing Then Exit Function
' проверка пересечения
Call D3DX.Intersect(Mesh, RayPos, RayDir, RetHit, RetFaceIndex, RetU, RetV, RetDist, CountHits)
If RetHit Then Mesh_Intersect = True
End Function


для меня стало очевидным, что эта функция определяет пересечение с объектом в его оригинальном масштабе, положении и ориентации, то есть без применения матричных преобразований. это проблема первая, но не главная. я откл матричные преобразования, и вижу объект в его девственном виде, кладу на центр экрана спрайт прицел, и вожу центром по этому мешу. пересечение определяется в 70-80% случаев правильно, но не в 100%. это сильно зависит от положения камеры как я заметил. не пойму в чем дело. удаление точки куда смотрит камера, и соотвественно второй точки луча подбирал разные, в том числе очень длинные.

Подскажите пожалуйста, какие нужны доп. преобразования луча перед применением этой функции, и почему. Что я делаю неправильно?
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 03.05.2011 (Вт) 15:41

Есть кто живой?
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Выбор 3D объекта мышкой

Сообщение Mikle » 04.05.2011 (Ср) 8:27

Перед применением Intersect обработай параметры камеры преобразованием, обратным тому, что у модели.

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 05.05.2011 (Чт) 22:31

Mikle писал(а):Перед применением Intersect обработай параметры камеры преобразованием, обратным тому, что у модели.

а если у модели нет никаких преобразований? она просто в центре мира в оригинальном масштабе и ориентации. точность проверки на пересечение не стопроцентная. почему?
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Выбор 3D объекта мышкой

Сообщение DODge » 05.05.2011 (Чт) 23:33

empty-name писал(а):...
Lych1 = vec3(Kam(0), Kam(1), Kam(2)) 'здесь соответственно координаты камеры
Lych2 = vec3(Kam(3), Kam(4), Kam(5)) 'здесь точка куда камера смотрит, это всё я вычисляю своими мат расчетами, думаю это ведь не имеет значения
...

Здесь и есть твоя главная ошибка. Ничего что функция Intersect принимает в качестве параметра RayDir нормализованый вектор направления луча из позиции RayPos? Тогда в твоём случае должно быть примерно так:
Код: Выделить всё
Dim RealRayDir as As D3DVECTOR
D3DXVec3Subtract(RealRayDir, Lych2, Lych1)
D3DXVec3Normalize(RealRayDir, RealRayDir)
Peres = Mesh_Intersect(Lych1, RealRayDir)

Писал из головы, может чё и упустил, но, думаю, понятно в чём смысл.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 08.05.2011 (Вс) 13:11

Спасибо большое :) теперь работает как часы :)
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 10.05.2011 (Вт) 17:10

а как теперь инвертировать этот луч обратно преобразованиям модели? :oops:
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 11.05.2011 (Ср) 9:00

если модель только перемещалась, я понимаю, а если она вращалась и масштабировалась?
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Выбор 3D объекта мышкой

Сообщение Mikle » 11.05.2011 (Ср) 9:35

Если для модели, к примеру, ты матрицу перемещения на vec3(2,3,4) умножал на матрицу вращения вокруг оси Y на 0.66 рад., то для камеры нужно выполнить противоположные действия в противоположном порядке - то есть матрицу вращения вокруг оси Y на -0.66 рад. умножить на матрицу перемещения на vec3(-2,-3,-4).

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 16.05.2011 (Пн) 9:32

мм.. а можно объяснить в коде?
ну вот у меня две трёхмерные координаты, какими функциями мне воспользоваться, чтобы применить трансформирование к этим координатам? когда я применяю трансформирование к моделям, при помощи матриц, я задаю матрицу, затем применяю её к миру перед прорисовкой модели. тоесть:
Код: Выделить всё
D3DDevice.SetTransform D3DTS_WORLD, Model.Matx
а как трансформировать луч? как к нему применить матрицы? применять к камере мне кажется не имеет смысла, координаты для неё я вычисляю и подставляю своими математическими расчетами.:
Код: Выделить всё
Dim matView As D3DMATRIX 'Матрица Обзора
D3DXMatrixLookAtLH matView, vec3(Kam(0), Kam(1), Kam(2)), _
                            vec3(Kam(3), Kam(4), Kam(5)), _
                            vec3(0, 1, 0)
                             
g_D3DDevice.SetTransform D3DTS_VIEW, matView


и эти же 2 координаты есть мой луч, для определения пересечения:

Код: Выделить всё
Dim RealRayDir As D3DVECTOR

Lych1 = vec3(Kam(0), Kam(1), Kam(2))
Lych2 = vec3(Kam(3), Kam(4), Kam(5))

D3DXVec3Subtract RealRayDir, Lych2, Lych1
D3DXVec3Normalize RealRayDir, RealRayDir
Peres = Mesh_Intersect(Lych1, RealRayDir)


то есть, если я применю трансформирование непосредственно к камере, это не повлияет на луч
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Выбор 3D объекта мышкой

Сообщение Mikle » 16.05.2011 (Пн) 10:01

Есть три ф-ции:
D3DXVec3Transform - для получения 4D вектора с W компонентой
D3DXVec3TransformCoord - для получения 3D вектора
D3DXVec3TransformNormal - для трансформации нормалей, не перемещает, а только поворачивает.
Тебе нужна D3DXVec3TransformCoord.

empty-name
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 18
Зарегистрирован: 30.01.2010 (Сб) 20:31
Откуда: Белая Калитва

Re: Выбор 3D объекта мышкой

Сообщение empty-name » 18.05.2011 (Ср) 14:43

Спасибо большое :) всё работает :)
Думаю все же, будущее искусственного интеллекта за эвристическим программированием

ProstoAlex
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 1
Зарегистрирован: 28.11.2011 (Пн) 19:13
Откуда: Санкт-Петербург

Re: Выбор 3D объекта мышкой

Сообщение ProstoAlex » 12.12.2011 (Пн) 16:17



Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

    TopList