[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Panda3D - по русски » Panda3D » Для начинающих » Перевод экранах координат в 3D. (Как выполнить конвертацию?)
Перевод экранах координат в 3D.
serg-kkzДата: Понедельник, 20.06.2011, 13:50 | Сообщение # 1
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Пишу гизмо для редактора уровней, сделал по подобию как в демке с шахматами, работает не плохо но при не которых положениях камеры оси очень чуствительные к мыши. Кто знает как можно конвертировать координаты мыши в 3D положение, разумеется без оси Z. Или без векторов ни как?

ООП  -  
 
ninthДата: Понедельник, 20.06.2011, 15:38 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Эм, если без оси Z, то как ты узнаешь где у тебя курсор? В воздухе или на поверхности земли или вообще поде землёй? Можно конечно сделать обратное преобразование - интересующий объект из 3d пространства в экранные координаты, но тут есть нюансы.
 
serg-kkzДата: Понедельник, 20.06.2011, 16:09 | Сообщение # 3
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Эм, ну вроде у экраных координат нет оси Z, только, X и Y. Значение оси Z я получаю у выделенного обьекта, впрочем как в демке, правда там фиксированное значение. Мне нужно по иному как то организовать перемещение гизмо за курсором. А то в демке всё завязано через камеру.
Вообщем делал проще присваивал значение оси мыши обьекту, но там обьект перемещается на растояние от -1 до 1))), пробовал коофиценты подбирать стаким расчётом чтоб обьект двигался за курсором не отстовая, но что то забросил я этот вариант, непопню почему... Меня в принципе
всё устраивает. Хотелось бы ещё узнать как можно задать координаты мыши программно, чтоб заблокировать движение мыши по какой нибуть оси.

Могу выложить редактор с прикрученным гизмо. Если нужно?


ООП  -  
 
ninthДата: Понедельник, 20.06.2011, 16:33 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Ага, давай, а то я не совсем пойму что ты хочешь организовать
 
serg-kkzДата: Понедельник, 20.06.2011, 19:20 | Сообщение # 5
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: 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
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Так, всё равно не совсем понял - ты хочешь перемещать объект в плоскости камеры или он должен ездить только по осям?
 
serg-kkzДата: Понедельник, 20.06.2011, 21:07 | Сообщение # 7
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
По осям за курсором. ninth ты редактор скачал? проблему видел? А что я хочу уже сам не знаю... запутался. Мне нужно двигать обьект по осям, вариант который использовал автор шахмат подходит, но там обьект двигается по двум осям X,Y. Я переделал для Z но имеется проблема. Другии варианты реализации перемещения обьекта за курсором есть?

ООП  -  

Сообщение отредактировал serg-kkz - Понедельник, 20.06.2011, 21:22
 
ninthДата: Понедельник, 20.06.2011, 21:42 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 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
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
ninth у тебя работает гизмо? и как?

ООП  -  
 
ninthДата: Понедельник, 20.06.2011, 22:09 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
глючно )) периодически едет совсем не туда, куда ведёшь мышь)
 
serg-kkzДата: Понедельник, 20.06.2011, 22:15 | Сообщение # 11
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Как поймать глюк я описал в посте где редактор, нужно камеру разместить вдоль оси X "красная штуковина)))" гизмо чем точнее тем глючней будет и двигать гизмо по оси Z. Без разницы с какой стороны. Попробуй и скажи результат.

ООП  -  

Сообщение отредактировал serg-kkz - Понедельник, 20.06.2011, 22:21
 
ninthДата: Понедельник, 20.06.2011, 22:44 | Сообщение # 12
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Да так и есть, но что ты хочешь в итоге-то? Как двигать объект в плоскости экрана я дал пример. Для фиксирования движения по осям его надо немного доработать. Но для того чтобы достичь конкретного результата надо столь же "конкретно" представлять каким этот результат должен быть.
 
serg-kkzДата: Вторник, 21.06.2011, 07:48 | Сообщение # 13
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: 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
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Зря поудалял - потому и зафигачивает.
В остальных позициях тоже не всё гладко. Ладно я попробую глянуть.
 
serg-kkzДата: Вторник, 21.06.2011, 12:12 | Сообщение # 15
Генерал-лейтенант
Группа: Модераторы
Сообщений: 689
Награды: 3
Репутация: 16
Статус: Offline
Ты про ось Z? или вообще про управление гизмо. Проверяешь в винде?

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