Перевод экранах координат в 3D.
|
|
serg-kkz | Дата: Понедельник, 20.06.2011, 13:50 | Сообщение # 1 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Пишу гизмо для редактора уровней, сделал по подобию как в демке с шахматами, работает не плохо но при не которых положениях камеры оси очень чуствительные к мыши. Кто знает как можно конвертировать координаты мыши в 3D положение, разумеется без оси Z. Или без векторов ни как?
ООП -
|
|
| |
ninth | Дата: Понедельник, 20.06.2011, 15:38 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Эм, если без оси Z, то как ты узнаешь где у тебя курсор? В воздухе или на поверхности земли или вообще поде землёй? Можно конечно сделать обратное преобразование - интересующий объект из 3d пространства в экранные координаты, но тут есть нюансы.
|
|
| |
serg-kkz | Дата: Понедельник, 20.06.2011, 16:09 | Сообщение # 3 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Эм, ну вроде у экраных координат нет оси Z, только, X и Y. Значение оси Z я получаю у выделенного обьекта, впрочем как в демке, правда там фиксированное значение. Мне нужно по иному как то организовать перемещение гизмо за курсором. А то в демке всё завязано через камеру. Вообщем делал проще присваивал значение оси мыши обьекту, но там обьект перемещается на растояние от -1 до 1))), пробовал коофиценты подбирать стаким расчётом чтоб обьект двигался за курсором не отстовая, но что то забросил я этот вариант, непопню почему... Меня в принципе всё устраивает. Хотелось бы ещё узнать как можно задать координаты мыши программно, чтоб заблокировать движение мыши по какой нибуть оси.
Могу выложить редактор с прикрученным гизмо. Если нужно?
ООП -
|
|
| |
ninth | Дата: Понедельник, 20.06.2011, 16:33 | Сообщение # 4 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Ага, давай, а то я не совсем пойму что ты хочешь организовать
|
|
| |
serg-kkz | Дата: Понедельник, 20.06.2011, 19:20 | Сообщение # 5 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| В демке с шахматами автор расчитывает X и Y координаты таким вот образом: point + vec * ((z-point.getZ()) / vec.getZ()) но как расчитать Z таким же способом? Я поступил так: point + vec * ((z-point.getY()) / vec.getY()) то есть по Y, но при таком подходе есть баг если камеру расположить вдоль X оси гизмо то двежение будет рывками. Если сделать так: point + vec * ((z-point.getX()) / vec.getX()), то баг уже будет если камеру расположить вдоль Y иногда выскакивает даже ошибка. Как поступить не пойму. Вот хотелось бы знать есть другие способы или только так?
Ещё интересный баг обнаружил у этого способа. Видимо связано как то с рендером а точнее его границами, надо обьект переместить максимально и он вернется спротивоположной стороны оси, аля путишествие вокруг света.
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 20.06.2011, 20:45 |
|
| |
ninth | Дата: Понедельник, 20.06.2011, 20:50 | Сообщение # 6 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Так, всё равно не совсем понял - ты хочешь перемещать объект в плоскости камеры или он должен ездить только по осям?
|
|
| |
serg-kkz | Дата: Понедельник, 20.06.2011, 21:07 | Сообщение # 7 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| По осям за курсором. ninth ты редактор скачал? проблему видел? А что я хочу уже сам не знаю... запутался. Мне нужно двигать обьект по осям, вариант который использовал автор шахмат подходит, но там обьект двигается по двум осям X,Y. Я переделал для Z но имеется проблема. Другии варианты реализации перемещения обьекта за курсором есть?
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 20.06.2011, 21:22 |
|
| |
ninth | Дата: Понедельник, 20.06.2011, 21:42 | Сообщение # 8 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Да, Скачал, Просто там из-за глюков не совсем понятно то, какой результат должен был бы быть в итоге ) вот пример перемещения объекта в плоскости камеры за мышой. Если надо фиксировать перемещение по осям, то потребуются ещё рассчёты. Code mpos = base.mouseWatcherNode.getMouse() nearPoint = Point3() farPoint = Point3() base.camLens.extrude(self.oldMPos, nearPoint, farPoint) fromvec = Vec3(farPoint - nearPoint) fromvec.normalize() nearPoint = Point3() farPoint = Point3() base.camLens.extrude(mpos, nearPoint, farPoint) tovec = Vec3(farPoint - nearPoint) tovec.normalize() scale = Vec3(np.getPos(render) - base.cam.getPos(render)).length() v = (tovec - fromvec)#*scale v.normalize()
np.setPos(np,np.getRelativePoint(base.cam,tovec*scale) - np.getRelativePoint(base.cam,fromvec*scale)) self.oldMPos = Point2(mpos) суть в следующем: считаются и нормализуются два вектора (fromvec, tovec) уходящих из камеры через курсор мыши (старую и новую позиции) в пространство с помощью Extrude; считается расстояние до интересующего нас объекта - это расстояние будет масштабом смещения; после этого из этих двух масштабированных векторов находится вектор смещения объекта. Если не сосем понятно объяснил - могу попробовать нарисовать схему.
добавление: Того же думаю можно добиться черз projection matrix - запись будет короче, но может быть сложнее для понимания сама суть работы с матрицами
|
|
| |
serg-kkz | Дата: Понедельник, 20.06.2011, 22:05 | Сообщение # 9 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| ninth у тебя работает гизмо? и как?
ООП -
|
|
| |
ninth | Дата: Понедельник, 20.06.2011, 22:09 | Сообщение # 10 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| глючно )) периодически едет совсем не туда, куда ведёшь мышь)
|
|
| |
serg-kkz | Дата: Понедельник, 20.06.2011, 22:15 | Сообщение # 11 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Как поймать глюк я описал в посте где редактор, нужно камеру разместить вдоль оси X "красная штуковина)))" гизмо чем точнее тем глючней будет и двигать гизмо по оси Z. Без разницы с какой стороны. Попробуй и скажи результат.
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 20.06.2011, 22:21 |
|
| |
ninth | Дата: Понедельник, 20.06.2011, 22:44 | Сообщение # 12 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Да так и есть, но что ты хочешь в итоге-то? Как двигать объект в плоскости экрана я дал пример. Для фиксирования движения по осям его надо немного доработать. Но для того чтобы достичь конкретного результата надо столь же "конкретно" представлять каким этот результат должен быть.
|
|
| |
serg-kkz | Дата: Вторник, 21.06.2011, 07:48 | Сообщение # 13 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Результат должен быть таким каким он есть уже в редакторе но, но без глюка когда камера распаложена вдоль оси X гизмо, ведь по моему в остальных позициях вполне коретнная работа.
Пробовал твой код, правда я его подрезал немножко.
mpos = base.mouseWatcherNode.getMouse() nearPoint = Point3() farPoint = Point3() base.camLens.extrude(self.oldMPos, nearPoint, farPoint) удалил fromvec = Vec3(farPoint - nearPoint) fromvec.normalize() nearPoint = Point3() удалил farPoint = Point3() удалил base.camLens.extrude(mpos, nearPoint, farPoint) tovec = Vec3(farPoint - nearPoint) tovec.normalize() scale = Vec3(np.getPos(render) - base.cam.getPos(render)).length() v = (tovec - fromvec) это ж ни где не испальзуется v.normalize() и это, удалил
np.setPos(np,np.getRelativePoint(base.cam,tovec*scale) - np.getRelativePoint(base.cam,fromvec*scale)) self.oldMPos = Point2(mpos) удалил
Вообщем мой обьект зафигачивает в долёкие края, ninth обьект в этот примере каким образом должен следовать за мышью?
ООП -
Сообщение отредактировал serg-kkz - Вторник, 21.06.2011, 07:54 |
|
| |
ninth | Дата: Вторник, 21.06.2011, 12:01 | Сообщение # 14 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Зря поудалял - потому и зафигачивает. В остальных позициях тоже не всё гладко. Ладно я попробую глянуть.
|
|
| |
serg-kkz | Дата: Вторник, 21.06.2011, 12:12 | Сообщение # 15 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Ты про ось Z? или вообще про управление гизмо. Проверяешь в винде?
ООП -
|
|
| |