forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Двигать объект двухмерным курсором (http://forum.boolean.name/showthread.php?t=2234)

Valet 30.12.2006 16:04

Двигать объект двухмерным курсором
 
День добрый.

Ситуация такая. Имеется объект (в данном случае - куб). Прилажен двухмерный курсор. После зажатия левой кнопки мыши с курсором на объекте при движении мышой влево\вправо и вверх\вниз объект наш двигается по осям Х и Z...

Как так сделать? На какие величины двигать? :4to:

Заранее спасибо.

c0mrad 30.12.2006 16:16

Re: Двигать объект двухмерным курсором
 
MoveEntity куб,mxs#*.01,0,-mys#*.01 ,где
mxs# и mys# соответственно MouzeXspeed и MouseYspeed разделенные на чуствительность.

Valet 30.12.2006 17:02

Re: Двигать объект двухмерным курсором
 
Все. Благодарю. :)

Platon 30.12.2006 19:46

Re: Двигать объект двухмерным курсором
 
2c0mrad
Извращенец?:-)
2Valet
Тут нужно преобразовать 3д координаты в 2д и наоборот:
Тыкай на куб и двига
Код:

Graphics3D(640, 480, 16, 2)
SetBuffer(BackBuffer())

Global SCR_CX = GraphicsWidth() / 2
Global SCR_CY = GraphicsHeight() / 2
Global CAM_ZOOM# = 1.1

Camera = CreateCamera()
CameraZoom(Camera, CAM_ZOOM)

Cube = CreateCube()
EntityPickMode(Cube, 2)
PositionEntity(Cube, 3, 0, 10)

Repeat
       
        If MouseDown(1) Then
                If (Obj = 0) Then
                        Obj = CameraPick(Camera, MouseX(), MouseY())
                        If Obj Then
                                Dx = MouseX() - EntityX2D(Obj)
                                Dy = MouseY() - EntityY2D(Obj)
                        EndIf
                Else
                        PositionEntity2D(Obj, MouseX() - Dx, MouseY() - Dy)
                EndIf
        Else
                Obj = 0
        EndIf
       
        RenderWorld()
        Flip()
Until KeyDown(1)
End

Function PositionEntity2D(Entity, Px, Py)
        PositionEntity(Entity, (Px - SCR_CX) * EntityZ(Entity) / SCR_CX / CAM_ZOOM, (SCR_CY - Py) * EntityZ(Entity) / SCR_CX / CAM_ZOOM, EntityZ(Entity))
End Function

Function EntityX2D(Entity)
        Return EntityX(Entity) * SCR_CX * CAM_ZOOM / EntityZ(Entity) + SCR_CX
End Function

Function EntityY2D(Entity)
        Return SCR_CY - (EntityY(Entity) * SCR_CX * CAM_ZOOM / EntityZ(Entity))
End Function

ЗЫ
И использовать CameraPick() чтобы определить клик на 3д обьекте.

c0mrad 30.12.2006 19:50

Re: Двигать объект двухмерным курсором
 
Цитата:

Тут нужно преобразовать 2д координаты в 2д и наоборот
Кто из нас еще извращенец:преобразовывать 2д координаты в 3д =)

Valet 31.12.2006 01:42

Re: Двигать объект двухмерным курсором
 
Ой мальчики, вы только не ссорьтесь :) Спасибо обоим. Особенно Платону - как раз то, что я хотел!

ZanoZa 31.12.2006 01:56

Re: Двигать объект двухмерным курсором
 
Цитата:

Кто из нас еще извращенец:преобразовывать 2д координаты в 3д =)
а как ты без этого сделаешь? даже в твоем примере это происходит(тока не знаю насчёт правильности :) )

HolyDel 31.12.2006 02:05

Re: Двигать объект двухмерным курсором
 
не все, я думаю, понимают смысл буквы "д".
imho: Неразбериха возникла из-за постановки вопроса. В любом случае лутче уж два ответа чем один, если точно не знаеш что от тебя хотят ;)

moka 01.01.2007 23:00

Re: Двигать объект двухмерным курсором
 
В первом варрианте, если камера повёрнута куда-либо, то уже не прокатывает.
Мой варриант, только теория как я в своём редакторе делал движение:
Есть plane, который ставится на высоту PickedY, и выберается объект который выбрали. Плайн конечно прозрачный. После того как объект выбран у него убирается Пик, а у плайна остаётся, и нужно просто двигать на разницу от того момента как зажал мышку на объекте, и текущих Пик координат на Плайне. Вот и всё, это лучший варриант, по мне так.

Valet 02.01.2007 13:04

Re: Двигать объект двухмерным курсором
 
В первом варрианте, если камера повёрнута куда-либо, то уже не прокатывает.

Верно.

Ксатати, Мока, я мог бы у тебя потом парочку вещей спросить, иначе я делаю нечто вроде твоего редактора (где можно было размещать и двигать объекты)?

moka 05.01.2007 01:46

Re: Двигать объект двухмерным курсором
 
Цитата:

(где можно было размещать и двигать объекты)?
Не совсем понял вопроса.

HolyDel 05.01.2007 02:44

Re: Двигать объект двухмерным курсором
 
это вроде твой редактор RPG мира.

moka 05.01.2007 02:57

Re: Двигать объект двухмерным курсором
 
Где сам редактор? Вроде там в аттаче. :4to: Первый пост смотрите, темы проекта.

Myster 02.11.2007 17:03

Re: Двигать объект двухмерным курсором
 
А что нужно заменить или написать, чтобы 3д объект постоянно следовал за 2д курсором? То бишь чтобы мышь как бы была всегда нажата )

Alex_Noc 02.11.2007 17:43

Re: Двигать объект двухмерным курсором
 
команда mousedown()

Myster 02.11.2007 17:55

Re: Двигать объект двухмерным курсором
 
Цитата:

команда mousedown()
Вполне очевидно, что я переспрошу )) Команду-то я вижу, я знаю, что она значит, но все-таки хотелось бы попродробнее ))
Мне по сути mousedown вообще не нужен, мне НЕ надо, чтобы мышь буквально была всегда нажата. Надо просто чтобы объект следовал за мышью :)

moka 02.11.2007 18:55

Re: Двигать объект двухмерным курсором
 
Myster, смотри справку по CameraPick.
Я могу перефразировать твой вопрос: "У меня мало опыта, как мне его получить?"
Извени за грубость, но реально, просто начни с меньшего и просто учись, пользуйся своими способностями, и пологайся Только на себя, так ты научишся Очень быстро.

Myster 02.11.2007 19:28

Re: Двигать объект двухмерным курсором
 
MoKa, не, нормально, не грубо вовсе )) Хотя начальный опыт у меня точно есть, но все ж не идеален )) Все эти дела с командами я уже сделал, много раз коды правил во всевозможных местах :-) Справку всю изрыл, сущность я понимаю этих команд, но я не понимаю банально "почему оно не работает?" %) )) Я уже долго с этим мучаюсь, +после всего неделю поиском пользовался, в результате ни к чему не пришел, поэтому вопрос и задаю. В конце концов, я думал этот форум создан помогать людям :@ :pardon: Я исключительно в безвыходной ситуации задаю вопросы ))
Мне бы понять как в приведенном Cyan'ом коде сделать так, чтобы куб этот можно было постоянно двигать :crazy: Хотелось бы прям кусочком кода хотя бы, если возможно. Если кто-то хоть чем-то может намекнуть (кроме единичной команды), буду оч признателен :) Заранее спс )

moka 02.11.2007 19:32

Re: Двигать объект двухмерным курсором
 
Myster :)
Смотри, у нас есть объект(модель), есть цель(пивот).
Коммандами CameraPick можно получить точку нажатия, туда ставишь пивот (цель).
Далее функцией PointEntity направляешь модель на пивот. И поворачиваешь модель так:
RoateEntity Entity,0,EntityYaw(Entity),0
Таким образом будет предотвращено поворачивание по всем осям кроме горизонтальной.
И двигаешь вперёд (+z).

Myster 02.11.2007 23:49

Re: Двигать объект двухмерным курсором
 
Вложений: 1
MoKa, спс большой, подсказка очень дельная. Я не сказал, что мне надо, но ты уже понял: именно то, что мне нужно - объект и цель, на которую он смотрит :)
Но когда я традиционным копи-пастом совместил код Cyan'а со своим, опять плохо поперло :dontknow: Может это из-за того, что у меня вид сверху сделан, а тут сбоку? А может и нет, не знаю :crazy:
Моя мышь все равно не хочет привязываться, более того, она ваще той же мышой не двигает куб.
Если кто может, проверьте плиз код, если несложно, в чем проблема-то?:''(( Почему мыша не привязывается? Я пробовал всякими способами, но это получалось глючное вечно скачущее нечто:-)
ПС: mousehit я оставил для целостности, чтобы все видели где заимствованный код )) да и вообще там многое сохранено )

moka 05.11.2007 18:02

Re: Двигать объект двухмерным курсором
 
Цитата:

0 просмотров
Ни кто не будет копаться в чужём коде.
Не знаешь почему, т.к. копи-пастишь. Удали всё и напиши с нуля, напрягись. Ты сможешь.

Platon 07.11.2007 08:35

Re: Двигать объект двухмерным курсором
 
Цитата:

Сообщение от MoKa
В первом варрианте, если камера повёрнута куда-либо, то уже не прокатывает.

Это не проблема, можно умножить полученые координаты (вектор) на матрицу трансформации камеры и все. Так же и с другими обьектами, не только с камерой.
Код:

;Разрешение
ScreenWidth = 800
ScreenHeight = 600

;Центр экрана
CenterX = ScreenWidth Shr 1
CenterY = ScreenHeight Shr 1

;Инициализация графики
Graphics3D(ScreenWidth, ScreenHeight, 32, 2)
SetBuffer(BackBuffer())

;Камера
Camera = CreateCamera()

;Принудительная установка угла фокуса камеры необходима чтобы проекция
;была корректной т.к. узнать его с помощью средств Блица невозможно
Zoom# = 1.2
CameraZoom(Camera, Zoom)

;Проецируемый объект
Cube = CreateCube()

;Удаление объекта от камеры
Mz = 10
Repeat
       
        ;Вращаем и двигаем камеру чтобы убедиться в корректности проекции
        TurnEntity(Camera, 0.5, 1.2, -2.1)
        MoveEntity(Camera, 1.5, 0.05, 0.4)
       
        ;Получаем экранные координаты
        Mx = MouseX()
        My = MouseY()
        ;Изменяем координату "удаленности" объекта от камеры
        Mz = Mz + MouseZSpeed()
       
        ;############################################
        ;Проецируем экранные координаты в мировые
        Px# = (Mx - CenterX) * Mz / Zoom / CenterX
        Py# = (My - CenterY) * Mz / -Zoom / CenterX
        ;Умножаем координаты (вектор) на матрицу трансформации камеры
        Wx# = GetMatElement(Camera, 0, 0) * Px + GetMatElement(Camera, 1, 0) * Py + GetMatElement(Camera, 2, 0) * Mz + GetMatElement(Camera, 3, 0)
        Wy# = GetMatElement(Camera, 0, 1) * Px + GetMatElement(Camera, 1, 1) * Py + GetMatElement(Camera, 2, 1) * Mz + GetMatElement(Camera, 3, 1)
        Wz# = GetMatElement(Camera, 0, 2) * Px + GetMatElement(Camera, 1, 2) * Py + GetMatElement(Camera, 2, 2) * Mz + GetMatElement(Camera, 3, 2)
        ;Позиционируем объект по полученым координатам
        PositionEntity(Cube, Wx, Wy, Wz)
        ;Поворачиваем объект по углам поворота камеры чтобы убрать влияние ориентации камеры
        RotateEntity(Cube, EntityPitch(Camera), EntityYaw(Camera), EntityRoll(Camera))
        ;############################################
       
        RenderWorld()
        Flip()
Until KeyDown(1)
End

Хотя уже поздно, но может кому пригодится. :)


Часовой пояс GMT +4, время: 07:24.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot