Seite 1 von 1

IrrLicht3D , Node ausrichten

Verfasst: 25.12.2007 09:31
von tft
Hallo ...

weis einer wie ich mit Irrlicht eine SceneNode auf einen punkt im 3D Raum ausrichten kann?

MfG TFT

Verfasst: 29.12.2007 21:27
von Max_der_Held
hm.. bei OPEN Gl hats mal nen befehl gegeben, der die camera dreht... wenn man des umschreibt, könnte man die entstehende formel zum drehen vom OBjekt hernehmen.. viel spaß :ironie:

Code: Alles auswählen

piover180.f = (ATan(1)*4)/180 

gluLookAt__(-CameraX, -CameraY, -CameraZ, -(CameraX + Sin(CamrotY*piover180)*10), 0, -(CameraZ + Cos(CamrotY*piover180)*10)+1, 0.0, 1.0, 0.0)
beschreibung des befehls (alles aus nem opengl tutorial):
  • ; Mit gluLookAt definieren wir den Standort der Sicht. Die ersten drei Parameter sind die Position. Die zweiten drei ist die GuckPOSITION. Die dritten sind der UpVektor(fast immer 0.0, 1.0, 0.0)
mfg, max
  • [EDIT] wenn du's mal irgendwie rauskriegst, dann postes bitte.. ich such sowas auch, eigentlich (laser-schuss-mesh in schussrichtung ausrichten)
    [/edit]

Verfasst: 29.12.2007 22:00
von tft
Hi ...

danke für die Antwort... leider blicke ich da nicht durch .... mal sehen was ich draus machen kann.

Verfasst: 29.12.2007 22:22
von Thalius
Hier ne C++ Funktion - siehst mal die Mathe dahinter. Baue die noch ein ( einfachheitshalber ).... Aber irgendwo hatte ich das schon mal beantwortet hier... puh scheissgrippe .. immernoch schlepp ich die rum.

Code: Alles auswählen

; void faceTarget(irr::core::vector3df targetPos) {
;   core::vector3df nodePos = targetPos - myNode->getPosition();
;   myRotation.Y = ATan(nodePos.Z/nodePos.X) * (180.0f / irr::core::PI);
;   If((targetPos.X - myNode->getPosition().X) > 0) {
;     myRotation.Y = 90 - myRotation.Y;
;   } Else If((targetPos.X - myNode->getPosition().X) < 0) {
;     myRotation.Y = -90 - myRotation.Y;
;   }
;   myRotation.Y -= 90;
;   myNode->setRotation(myRotation);
; }
vector3df = vector 3d float
resp. ( findest du im include file )

Code: Alles auswählen

Structure IRR_VECTOR
    x.f
    y.f
    z.f
EndStructure
Damit sollts eigentlich einfach sein.
Neue Version wird noch n Command dazu kommen ( Geplant ist auch ein "Newbie" set das DarkBASIC alike simple ist... - aber erst mal muss ich etwas feddich kriegen - typisch widermal an 10 sachen dran hier :)

Falls partu ned weiterkommst schreib ichs um die Tage mal...

Thalius

Verfasst: 31.12.2007 18:18
von SirCus
gibts da nich schon ne Funktion? Hab da was in erinnerung. In der Hilfe war als Beispiel eine Rakete genannt, die sich aufs Ziel ausrichtet.. hab grad Irrlicht nich hier..

Verfasst: 31.12.2007 18:25
von Thalius
Yup für den Pitch:


** schnipp **
// Especially wanted from Xperience2003
// Usefull for all out there
// Author : Xaron

/**
* @brief guided missile steering helper function
*
* @param missilePosition - current absolute position of the missile
* @param missileRotation - current absolute rotation of the missile
* @param targetPosition - current absolute target position
* @param oversteer - oversteer factor in degrees
*
* @return targetPitchRoll - delta pitch (x) and delta roll (z) values to the target
*

Code: Alles auswählen


NAME
    IrrGetToTargetPitchRoll - 
 SYNOPSIS
   IrrGetToTargetPitchRoll(*sourceNode.l, *targetNode.l, *x.f, *y.f, *z.f)
 INPUTS
   *sourceNode.l     - pointer to a Scene Node that act as Source (maybe the Rocket)
   *targetNode.l     - pointer to a Scene Node to point at (maybe a enemy)
   *x.f,*y.f,*z.f    - targetPitchRoll : delta pitch (x) and delta roll (z) values to the target
 FUNCTION
   guided missile steering helper function
 EXAMPLE
   IrrGetToTargetPitchRoll(*rocketNode,*destinationNode, @x.f,@y.f,@z.f )
 RESULT
   nothing
 NOTES
   This wraps a Method, found in the Irrlicht-Forum
   Author of the Method is : Xaron
** schnapp **

Thalius

Verfasst: 09.01.2008 02:06
von Thalius
Und die C++ Funktion übersetzt:

IrrFaceTargetNode()

Siehe hier:
http://www.purebasic.fr/english/viewtopic.php?t=30500

Thalius

Verfasst: 26.04.2008 12:37
von D4uS1
Wenn ich das richtig vertsehe willst du das das Objekt in eine richtige Richtung schaut. Am besten du löst das ganze mit trigonometrie [cos, tan, sin] ( mach ich auch immer so ).

Bsp.

Code: Alles auswählen

Procedure.f Objektneigung(Bahn.f, StreckeX.f, StreckeY.f, StreckeZ.f, Achse.b)

 If Achse = #ACHSE_X
  
 ElseIf Achse = #ACHSE_Y
  If StreckeZ < 0
   ProcedureReturn (ACos(StreckeX/Bahn)*360)/(2*#PI)
  Else
   ProcedureReturn 360-(ACos(StreckeX/Bahn)*360)/(2*#PI)
  EndIf
 ElseIf Achse = #ACHSE_Z
  
 EndIf
 
EndProcedure
Du musst die dementsprechenden Befehle für die anderen Achsen ergänzen, ich weiß ja nicht in welche Richtung dein Objekt standardmäßig schaut. Das hier ist nur ein Beispiel.

Bahn ist die Bahnegschwindigkeit, also im Grunde die Hypothenuse.

Und gib Acht, PB benutzt in Sachen Winkelberechnungen das Bogenmaß und Irrlicht das Gradmaß, man muss erst umrechnen.


lg
Andreas