Intersect?

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

Модератор: Mikle

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Intersect?

Сообщение longwair » 20.03.2012 (Вт) 20:24

Столкнулся с проблемой, при помощи Intersect распознаю мэшь"ворота". Так вот, в демке помещение и ворота, когда к воротам подходишь ближе, они смещаются в сторону, но Intersect продолжает видеть эти ворота, как будто бы остался какой то их "образ", а ворота сместились в сторону. Посмотрите пожалуйста, может где ошибаюсь. Точнее я ошибаюсь, а вот где, понять не могу. А может просто Intersect как то по другому использовать надо?
У вас нет доступа для просмотра вложений в этом сообщении.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 21.03.2012 (Ср) 8:50

Перед вызовом Intersect позицию и направления луча нужно преобразовывать аналогично преобразованию WORLD (правка: обратное преобразование), для позиции TransformCoord, для направления TransformNormal.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 21.03.2012 (Ср) 11:21

Код: Выделить всё
v = vec3(dv1, 15, dv2)
vI = vec3(dv1, 15, dv2 + 50)

D3DXVec3TransformNormal v, vI, matView

D3DX.Intersect Vorota.Model, v, vI, h, 0, 0, 0, d, 0

Вставил я короче TransformNormal перед Intersect, если вставляю ещё TransformCoord то выдаёт ошибку. Да и без TransformCoord всё равно как то криво работает, да и ворота если уезжают то всё равно пересечение =1. Хотя я вообще не уверен что делаю правильно.
Mikle помоги. Куда что нужно вставлять, смотрел с форумов примеры Pricel да и ты мне демку скидывал с чайником и шариком, не могу понять хоть убей.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 21.03.2012 (Ср) 13:19

Я написал "преобразованию WORLD", а не "View", кроме того я написал "обратное преобразование", то есть инвертируй матрицу. Добавь это:
Код: Выделить всё
Dim M As D3DMATRIX
Dim tv As D3DVECTOR
Dim tvI As D3DVECTOR
d3ddevice.GetTransform D3DTS_WORLD, M
D3DXMatrixInverse M, 0, M
D3DXVec3TransformCoord tv, v, M
D3DXVec3TransformNormal tvI, vI, M
D3DX.Intersect Vorota.Model, tv, tvI, h, 0, 0, 0, d, 0

Только это должно быть ПОСЛЕ строки:
Код: Выделить всё
DrawGameMesh Vorota, 0, OT, 0

потому, что в ней ты устанавливаешь мировую матрицу ворот.
И так:
Код: Выделить всё
If Keyb(vbKeyEscape) Then End

быть не должно. Потому, что так не должно быть НИКОГДА!

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 21.03.2012 (Ср) 14:07

Спасибо всё работает. :)
А на счёт
Код: Выделить всё
If Keyb(vbKeyEscape) Then End

кстати вопрос, что будет если просто закрывать форму, не убивая ни модели ни текстуры и ......?
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 21.03.2012 (Ср) 15:29

Если перед закрытием не освобождать DirectX ресурсы, часть их них так и останется висеть в памяти.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 21.03.2012 (Ср) 15:33

Mikle сделал всё как ты написал, и всё вроде бы работало нормально пока не переместил ворота на большее расстояние.
Код: Выделить всё
DrawGameMesh Vorota, 500, 500, 0

вот тут и начинается погрешность, вектор начинает их(ворота) видеть не дойдя до них, если идти вправо. :arrow:
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 22.03.2012 (Чт) 10:49

Например, у тебя в модуле ModD3D в процедуре SetupMatrices написано:
Код: Выделить всё
vec3(dv1, 15, dv2 + 10)

а в форме в процедуре Render:
Код: Выделить всё
vec3(dv1, 15, dv2 + 1000)

Что это за "волшебные" константы, почему разные?
А зачем ты меняешь местами оси координат? Я об этом:
Код: Выделить всё
D3DXMatrixTranslation matWorld, mY, mZ, mX

Разбирая работу кода, приходится думать: "Так, это координата X, вообще-то он Y, что там с ним происходит? С X-ом, ну в смысле с Y-ом?"
Думаешь кто-то будет делать за тебя грязную работу, искать твою ошибку? Ведь дело не в том, что D3DX.Intersect криво работает, а в том, что в коде где-то есть ошибки, код плохо читаемый.
А что это за опрос управления:
Код: Выделить всё
If Keyb(vbKeyW) Then dv2 = dv2 + 1
If Keyb(vbKeyS) Then dv2 = dv2 - 1
If Keyb(vbKeyA) Then dv1 = dv1 - 1
If Keyb(vbKeyD) Then dv1 = dv1 + 1

Как будет работать на компьютере с другим быстродействием?
А что за "Public ss As String"? Переменные с ничего не говорящим названием НЕЛЬЗЯ делать Public. И почему она "As String", если ей присваиваются числовые значения?
А зачем в SetupMatrices устанавливать мировую матрицу, если ты её всё равно задаёшь в DrawGameMesh для каждого объекта?
Вычлени из кода только то, что на твой взгляд неправильно работает, остальное УДАЛИ, выложи это отдельным проектом, и тебе обязательно помогут. Но, вычленяя из кода нужное, ты, скорее всего, сам найдёшь ошибку.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 23.03.2012 (Пт) 18:37

Да :oops: . Чувствую себя школьником которого ругает папа. Mikle в том то и дело что нет такого человека как ты, который бы всё объяснил, разжевал, что и как должно работать. Всё что сделал это копи-пастинг из других программ, кое что с твоей помощью уже начал понимать. Если бы ты не сказал что в двух местах установил мировую матрицу, так бы и не заметил. А так скопирую часть кода и пытаюсь сам логически со всем разобраться. Поэтому и трудности такие. Эх а так хочется хоть маленькую игрулинку сделать.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 24.03.2012 (Сб) 12:31

Никто тебя не ругает :)
Это я указываю, что ошибка не там, где ты ищешь. Само по себе то, что по некоторой причине Intersect дал неверную информацию, это мелочь, подобная ошибка у всех бывает, и легко устраняется, если архитектура программы грамотно продумана. С архитектурой нужно определиться ДО того, как ничинаешь что-то писать. Например:
1. Если трансформации проекции и видовая применяются для всех объектов одни и те же, то имеет смысл их устанавливать один раз при инициализации D3D. Если значения матриц этих трансформаций требуются при расчётах, имеет смысл создать для них Public переменные с понятными названиями, например "MtrxProj", "MtrxView", чтобы постоянно не вызывать GetTransform.
2. Раз мировая матрица у каждого объекта своя, то есть смысл хранить её в Public (или в Private, доступной через свойство) переменной класса, описывающего объект (или в поле структуры, если вместо классов применяются структуры). Если у одного класса она называется "MtrxWorld", то так же она должна называться у всех классов.
3. Так же, если какие-то другие параметры, например установки фильтрации текстур, применяются всегда одни и те же, то задаём их при общей инициализации, если нет - каждый объект устанавливает их сам.
4. Бывают параметры, которые можно считать общими для всех, но с некоторыми исключениями, такие параметры тоже устанавливаем при общей инициализации, но те объекты, которые их меняют, САМИ восстанавливают их значения после того, как изменили. Пример - скайбокс, он может менять трансформацию View, перемещая камеру в точку vec3(0, 0, 0), но после Draw он возвращает значение MtrxView по умолчанию. Другой пример - снайперский прицел, который временно меняет матрицу проекции, или когда меняется D3DTSS_TEXCOORDINDEX, например для бампа, тогда объект, меняющий эту величину, восстанавливает значение по умолчанию (равное номеру текстурной стадии).

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 27.03.2012 (Вт) 17:58

Mikle Запихал всё в твою программу "КАМЕРА", пробовал и так и так, скоро с ума сойду. Либо это от того что я много над этим думаю, либо я дурак " я сам думаю что второе))". Ну так вот запихал я всё в твою программу как и сказал, но теперь всё стало ещё хуже, не могу понять как разчитать Intersect так, что бы в какую сторону не пойти если курсором повернуться на бочку что бы она распознавалась Intersect.
У вас нет доступа для просмотра вложений в этом сообщении.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 27.03.2012 (Вт) 22:28

Код: Выделить всё
v = vec3(CamPos.x, CamPos.y - 10, CamPos.z)
vI = vec3(CamPos.x, CamPos.y - 10, CamPos.z + 1000)

Да... ты можешь объяснить, какой смысл ты вкладываешь в эти константы - -10, 1000?
vI у тебя - это вектор направления взгляда, ты всегда смотришь в направлении (0, -10, 1000)? Нет, ты смотришь туда, куда направил взгляд мышью.
Замени этот файл:
У вас нет доступа для просмотра вложений в этом сообщении.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 28.03.2012 (Ср) 6:44

Ну про то что это вектор взгляда я понимаю, Я просто пробовал подставлять Diff и Angle. Блин я же говорил что я дурак. Спасибо как всегда если бы не ты кто бы ещё помог. А константы эти выкладывал, ну должен же я был хоть что то написать. :)
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 28.03.2012 (Ср) 8:40

longwair писал(а):Ну про то что это вектор взгляда я понимаю, Я просто пробовал подставлять Diff и Angle

Diff и Angle - это углы (скаляры), а не векторы.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Intersect?

Сообщение longwair » 29.03.2012 (Чт) 8:49

Вопросы только прибавляются. А вот допустим я сделал 2 бочки так
Код: Выделить всё
  d3dDevice.SetTexture 0, TexBothka
  DrawGameMesh Bothka, 0, 0, 50
 
  d3dDevice.SetTexture 0, TexBothka
  DrawGameMesh Bothka, 15, 0, 50

Пересечение распознаётся только с последней бочкой, неужели придётся для каждой бочки делать отдельный Intersect?
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Intersect?

Сообщение Mikle » 29.03.2012 (Чт) 10:32

longwair писал(а):неужели придётся для каждой бочки делать отдельный Intersect?

Конечно. Распознаётся Intersect с тем мешем, мировую матрицу которого использовали.


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

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

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

    TopList