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=11550)

rr333 23.12.2009 10:35

поворот объекта на объект
 
Цитата:

Function createquad()
quad=CreateMesh()
surf=CreateSurface(quad)
v1=AddVertex(surf,0,5,0)
v2=AddVertex(surf,0,-5,0)
v3=AddVertex(surf,40,5,0)
v4=AddVertex(surf,40,-5,0)
AddTriangle(surf,v1,v3,v4)
AddTriangle(surf,v1,v4,v2)
RotateMesh quad,90,0,0
EntityColor quad,0,0,0
Return quad
End Function
Function obzor(cam)
If KeyDown(31) Then MoveEntity cam,0,0,-temp
If KeyDown(17) Then MoveEntity cam,0,0,temp
If KeyDown(30) Then MoveEntity cam,-temp,0,0
If KeyDown(32) Then MoveEntity cam,temp,0,0
xm=MouseXSpeed()
ym=MouseYSpeed()
MoveMouse 400,300
TurnEntity cam,ym*mouse,-xm*mouse,0
End Function
Function update(cam,mesh1,mesh2,mesh3)
RotateEntity mesh1,0,-(ATan2(EntityX(cam,1)-EntityX(mesh1,1),EntityZ(cam,1)-EntityZ(mesh1,1)))+90,270,1
RotateEntity mesh2,-(ATan2(EntityY(cam,1)-EntityY(mesh2,1),EntityZ(cam,1)-EntityZ(mesh2,1)))+90,0,0,1
End Function
Graphics3D 800,600,0,0
Global mouse#=.1,temp#=.5
w1=createquad()
PositionEntity w1,-7,0,0
w2=createquad()
PositionEntity w2,0,0,7
cam=CreateCamera()
CameraClsColor cam,255,255,255
PositionEntity cam,0,2,-10
Repeat
obzor cam
update cam,w1,w2,w3
RenderWorld
UpdateWorld
Flip()
Until KeyHit(1)
End
Два прямоугольника поворачиваются к камере вокруг своей локальной оси. А как сделать, чтобы эту ось можно было изменять, т. е. при любом повороте объекта он остался повернут своей полной видимой стороной к камере, и поворачивался по своей локальной, той же оси.
Я что-то не могу понять как это сделать.

Reizel 23.12.2009 11:21

Ответ: поворот объекта на объект
 
гм... EntityYaw and EntityPitch and EntityRoll тебе в помощь, PointEntity

Crystal 23.12.2009 16:40

Ответ: поворот объекта на объект
 
Угу, поворачивай свои объекты на углы положения камеры,
находя их через команды предоставленные выше.

rr333 24.12.2009 14:49

Ответ: поворот объекта на объект
 
Цитата:

Угу, поворачивай свои объекты на углы положения камеры,
Так спрайты делаются,но для моего случая такой способ не подходит
Но я решил проблему:
1)создаю пивот у объекта
2)припаренчиваю камеру к пивоту
3)поворачиваю пивот на угол, отрицательный углам объекта
4)высчитываю угол поворота объекта по формуле (в коде выше, функция-update)
5)возвращаю камеру на место и отпаренчиваю от пивота
6)удаляю пивот

Alex_Noc 02.01.2010 11:06

Ответ: поворот объекта на объект
 
чет метод чрезжопный какой то )))

Nex 02.01.2010 14:49

Ответ: поворот объекта на объект
 
Может быть стоит использовать функцию HolyDel'a (CurvePointEntity)?

Reizel 02.01.2010 16:12

Ответ: поворот объекта на объект
 
Вот пока здесь спрошу....

В ообщем, в справке написано, что команда PointEntity(Entity1,Entity2,Angle#) направляет Entity1 на Entity2. Причем, если величина Angle# не указана, поворот осуществляется мгновенно, иначе поворачивает на Angle# за один шаг. Но, как я ни пробовал, выставлял Angle от 1 до .0001, Entity1 всегда направлялось мгновенно! Что же я делаю не так???

NitE 02.01.2010 16:20

Ответ: поворот объекта на объект
 
entity - entity handle
target - target entity handle
roll# (optional) - roll angle of entity

Description
Points one entity at another.

The optional roll parameter allows you to specify a roll angle as pointing an entity only sets pitch and yaw angles.

If you wish for an entity to point at a certain position rather than another entity, simply create a pivot entity at your desired position, point the entity at this and then free the pivot.

Reizel 02.01.2010 16:45

Ответ: поворот объекта на объект
 
Nite, справка и у меня есть, даже русская :) И там таккже все написано, а толку от этого Roll# никакого. Так все же знает кто как делать правильно?

Harter 02.01.2010 21:41

Ответ: поворот объекта на объект
 
Если я правильно понял, тебе нужно это:

Код:

Function SmoothPointEntity(e1,e2,smothness#=100.0,smeshen#=0)
        PositionEntity gPivot1,EntityX(e1),EntityY(e1)+smeshen,EntityZ(e1)
        PointEntity gPivot1,e2       
        RotateEntity e1, 0,curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0       
End Function

Function CurveAngle#(newangle#,oldangle#,increments#)
        If increments>1               
                If (oldangle+360)-newangle<newangle-oldangle
                        oldangle=360+oldangle
                End If
                If (newangle+360)-oldangle<oldangle-newangle
                        newangle=360+newangle
                End If
                oldangle=oldangle-(oldangle-newangle)/increments
        End If
        If increments<=1
                Return newangle
        End If
        Return oldangle

End Function


Reizel 02.01.2010 22:16

Ответ: поворот объекта на объект
 
Harter, если бы мне нужен был код, я бы его сам написал, но, мне было интересно умеет ли PiontEntity работать как мне надо :)
ЗЫ EntityYaw() никогда не возвратит значение >360 и <0, => в функции CurveAngle() можно проверку отключить...

NitE 02.01.2010 22:39

Ответ: поворот объекта на объект
 
Цитата:

Вот пока здесь спрошу....

В ообщем, в справке написано, что команда PointEntity(Entity1,Entity2,Angle#) направляет Entity1 на Entity2. Причем, если величина Angle# не указана, поворот осуществляется мгновенно, иначе поворачивает на Angle# за один шаг. Но, как я ни пробовал, выставлял Angle от 1 до .0001, Entity1 всегда направлялось мгновенно! Что же я делаю не так???
это бред.
Цитата:

Nite, справка и у меня есть, даже русская И там таккже все написано, а толку от этого Roll# никакого. Так все же знает кто как делать правильно?
это в купе с постами №7 и 8 ещё больший бред.
Цитата:

Harter, если бы мне нужен был код, я бы его сам написал, но, мне было интересно умеет ли PiontEntity работать как мне надо
нет не умеет. пиши код сам.


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

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