[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 2«12
Форум Panda3D - по русски » Panda3D » Для начинающих » Перевод экранах координат в 3D. (Как выполнить конвертацию?)
Перевод экранах координат в 3D.
ninthДата: Вторник, 21.06.2011, 12:26 | Сообщение # 16
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Проверял под линуксом - на всех осях дёргается и периодически ездит куда попало - зависит от того откуда камерой смотреть.
 
serg-kkzДата: Вторник, 21.06.2011, 12:32 | Сообщение # 17
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Да в винде приличней работает за исключением про описанный мною баг.

ООП  -  
 
ninthДата: Среда, 22.06.2011, 14:36 | Сообщение # 18
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Попробуй так.
Code

     def Move_Mod(self, task):
         if (self.GizmoSt == "on"):
             if base.mouseWatcherNode.hasMouse(): # Проверка в окне ли мышь
                 mpos = base.mouseWatcherNode.getMouse() # Получаем координаты мыши
                 self.RayGizmo.setFromLens(base.camNode, mpos.getX(), mpos.getY()) # Устанавлиаем их лучу
                  
                 Point = camera.getPos() # Берем позицию камеры
                 Vec = render.getRelativeVector(camera, self.RayGizmo.getDirection()) # Берем напраление луча
                  
                 pos3d = Point3()
                 nearPoint = Point3()
                 farPoint = Point3()
                 base.camLens.extrude(mpos, nearPoint, farPoint)
                 if (self.GizmoAxis == 'X'):
                     if abs(Point.getZ() - self.AxisNode.getZ()) > abs(Point.getY() - self.AxisNode.getY()):
                         pl = Plane(Vec3(0,0,1), self.AxisNode.getPos(render))
                     else:
                         pl = Plane(Vec3(0,1,0), self.AxisNode.getPos(render))
                     if pl.intersectsLine(pos3d,
                         render.getRelativePoint(camera, nearPoint),
                         render.getRelativePoint(camera, farPoint)):
                         self.AxisNode.setX(pos3d.getX() - self.InfAxis.getX())

                 if (self.GizmoAxis == 'Y'):
                     if abs(Point.getZ() - self.AxisNode.getZ()) > abs(Point.getX() - self.AxisNode.getX()):
                         pl = Plane(Vec3(0,0,1), self.AxisNode.getPos(render))
                     else:
                         pl = Plane(Vec3(1,0,0), self.AxisNode.getPos(render))
                     if pl.intersectsLine(pos3d,
                         render.getRelativePoint(camera, nearPoint),
                         render.getRelativePoint(camera, farPoint)):
                         self.AxisNode.setY(pos3d.getY() - self.InfAxis.getY())
                      
                 if (self.GizmoAxis == 'Z'):
                     if abs(Point.getX() - self.AxisNode.getX()) > abs(Point.getY() - self.AxisNode.getY()):
                         pl = Plane(Vec3(1,0,0), self.AxisNode.getPos(render))
                     else:
                         pl = Plane(Vec3(0,1,0), self.AxisNode.getPos(render))
                     if pl.intersectsLine(pos3d,
                         render.getRelativePoint(camera, nearPoint),
                         render.getRelativePoint(camera, farPoint)):
                         self.AxisNode.setZ(pos3d.getZ() - self.InfAxis.getZ())
                          
                      
                 self.editX.SetValue(str(self.AxisNode.getX())) # устанавливаем в текстовый контрол выбраное значение X(обязательно в строковом)  
                 self.editY.SetValue(str(self.AxisNode.getY())) # //
                 self.editZ.SetValue(str(self.AxisNode.getZ()))
                  
                  
             self.object_key[self.name_selest].setPos(self.AxisNode.getPos()) # синхранизируем положение обьекта с гизмо
              
         return task.cont
 
serg-kkzДата: Среда, 22.06.2011, 14:50 | Сообщение # 19
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Всё работает как надо, СПАСИБО ninth.

ООП  -  
 
ninthДата: Среда, 22.06.2011, 15:31 | Сообщение # 20
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Алгоритм можно улучшить, но потребуются дополнительные расчёты. Нужно считать точку пересечения луча-мыши с такой плоскостью, нормаль которой является перпендикуляром опущенным из камеры на ось по которой происходит перемещение.
Сейчас в качестве нормали берётся одна из осей, перпендикулярных той, по которой перемещаемся.
Если ты планируешь перемещать не только по глобальным осям, но и по осям самого объекта, то всё равно потребуется дополнительно считать, так что можно будет заодно и алгоритм доработать.
 
serg-kkzДата: Среда, 22.06.2011, 15:47 | Сообщение # 21
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
ninth у меня мозги клинит когда речь заходит плоскостях, нормалях, о точках пересечения и.д. Я придумал другой алгоритм, а что если создавать плоскость в координатах гизмо повернутой к камере, и координаты получать от точек пересечения луча с ней. У меня подобным образом расчитывается поправка позиции при захвате гизмо чтоб центр не смещался в координаты курсора.

ООП  -  

Сообщение отредактировал serg-kkz - Среда, 22.06.2011, 15:49
 
ninthДата: Среда, 22.06.2011, 15:56 | Сообщение # 22
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Это я тебе и предлагал сначала в первом алгоритме. Перемещать объект в плоскости, параллельной плоскости экрана.
 
serg-kkzДата: Среда, 22.06.2011, 16:07 | Сообщение # 23
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Да теперь дошло, тут чё подумал плоскость надо создавать исходя из того какаю ось двигать надо, тоесть вдоль нужной координы оси гизмо, так думаю движение будет ровней и точней.

ООП  -  
 
ninthДата: Среда, 22.06.2011, 16:14 | Сообщение # 24
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
А это то, что я предлагаю во вором варианте ) И то что частично реализовано в выложенном коде.
 
serg-kkzДата: Среда, 22.06.2011, 16:21 | Сообщение # 25
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
Да я про колиде-плайн, а ты?

Добавлено (22.06.2011, 16:21)
---------------------------------------------
Хотя при таком подходе всё таки, при малых углах камеры будут проблемы. Лучше будет если всегда лицом к камере, и обязательно чтоб центры. совпадали с гизмо.


ООП  -  

Сообщение отредактировал serg-kkz - Среда, 22.06.2011, 16:23
 
ninthДата: Среда, 22.06.2011, 16:29 | Сообщение # 26
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Посмотри код - там используется пересечение луча с плоскостью. Для этого коллид плэйн не обязателен.
 
serg-kkzДата: Среда, 22.06.2011, 16:39 | Сообщение # 27
Генерал-лейтенант
Группа: Модераторы
Сообщений: 678
Награды: 3
Репутация: 16
Статус: Offline
У меня в уме операции расчитываются толко на том что можно преставить зрительно))).

ООП  -  
 
Форум Panda3D - по русски » Panda3D » Для начинающих » Перевод экранах координат в 3D. (Как выполнить конвертацию?)
Страница 2 из 2«12
Поиск: