Перевод экранах координат в 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
| У меня в уме операции расчитываются толко на том что можно преставить зрительно))).
ООП -
|
|
| |