| Перевод экранах координат  в 3D. | 
|  | 
| 
| ninth | Дата: Вторник, 21.06.2011, 12:26 | Сообщение # 16 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Проверял под линуксом - на всех осях дёргается и периодически ездит куда попало - зависит от того откуда камерой смотреть. |  |  |  |  | 
| 
| serg-kkz | Дата: Вторник, 21.06.2011, 12:32 | Сообщение # 17 |  |  Генерал-полковник Группа: Модераторы Сообщений: 803 Награды: 3 Репутация: 18 Статус: Offline | Да в винде приличней работает за исключением про описанный мною баг. 
 ООП  -
   |  |  |  |  | 
| 
| ninth | Дата: Среда, 22.06.2011, 14:36 | Сообщение # 18 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 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 |  |  Генерал-полковник Группа: Модераторы Сообщений: 803 Награды: 3 Репутация: 18 Статус: Offline | Всё работает как надо, СПАСИБО ninth. 
 ООП  -
   |  |  |  |  | 
| 
| ninth | Дата: Среда, 22.06.2011, 15:31 | Сообщение # 20 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Алгоритм можно улучшить, но потребуются дополнительные расчёты. Нужно считать точку пересечения луча-мыши с такой плоскостью, нормаль которой является перпендикуляром опущенным из камеры на ось по которой происходит перемещение. Сейчас в качестве нормали берётся одна из осей, перпендикулярных той, по которой перемещаемся.
 Если ты планируешь перемещать не только по глобальным осям, но и по осям самого объекта, то всё равно потребуется дополнительно считать, так что можно будет заодно и алгоритм доработать.
 |  |  |  |  | 
| 
| serg-kkz | Дата: Среда, 22.06.2011, 15:47 | Сообщение # 21 |  |  Генерал-полковник Группа: Модераторы Сообщений: 803 Награды: 3 Репутация: 18 Статус: Offline | ninth у меня мозги клинит когда речь заходит плоскостях, нормалях, о точках пересечения и.д. Я придумал другой алгоритм, а что если создавать плоскость в координатах гизмо повернутой к камере, и координаты получать от точек пересечения луча с ней. У меня подобным образом расчитывается поправка позиции при захвате гизмо чтоб центр не смещался в координаты курсора. 
 ООП  -
   
 
 Сообщение отредактировал serg-kkz - Среда, 22.06.2011, 15:49 |  |  |  |  | 
| 
| ninth | Дата: Среда, 22.06.2011, 15:56 | Сообщение # 22 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Это я тебе и предлагал сначала в первом алгоритме. Перемещать объект в плоскости, параллельной плоскости экрана. |  |  |  |  | 
| 
| serg-kkz | Дата: Среда, 22.06.2011, 16:07 | Сообщение # 23 |  |  Генерал-полковник Группа: Модераторы Сообщений: 803 Награды: 3 Репутация: 18 Статус: Offline | Да теперь дошло, тут чё подумал плоскость надо создавать исходя из того какаю ось двигать надо, тоесть вдоль нужной координы оси гизмо, так думаю движение будет ровней и точней. 
 ООП  -
   |  |  |  |  | 
| 
| ninth | Дата: Среда, 22.06.2011, 16:14 | Сообщение # 24 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | А это то, что я предлагаю во вором варианте ) И то что частично реализовано в выложенном коде. |  |  |  |  | 
| 
| serg-kkz | Дата: Среда, 22.06.2011, 16:21 | Сообщение # 25 |  |  Генерал-полковник Группа: Модераторы Сообщений: 803 Награды: 3 Репутация: 18 Статус: Offline | Да я про колиде-плайн, а ты? 
 Добавлено (22.06.2011, 16:21)
 ---------------------------------------------
 Хотя при таком подходе всё таки, при малых углах камеры будут проблемы. Лучше будет если всегда лицом к камере, и обязательно чтоб центры. совпадали с гизмо.
 
 ООП  -
   
 
 Сообщение отредактировал serg-kkz - Среда, 22.06.2011, 16:23 |  |  |  |  | 
| 
| ninth | Дата: Среда, 22.06.2011, 16:29 | Сообщение # 26 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Посмотри код - там используется пересечение луча с плоскостью. Для этого коллид плэйн не обязателен. |  |  |  |  | 
| 
| serg-kkz | Дата: Среда, 22.06.2011, 16:39 | Сообщение # 27 |  |  Генерал-полковник Группа: Модераторы Сообщений: 803 Награды: 3 Репутация: 18 Статус: Offline | У меня в уме операции расчитываются толко на том что можно преставить зрительно))). 
 ООП  -
   |  |  |  |  |