2 Punkte im 3D Raum Winkel errechnen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

2 Punkte im 3D Raum Winkel errechnen

Beitrag von Makke »

Hallo,

ich habe folgendes Problem: ich habe zwei Punkte im Raum (V1 und V2), jetzt möchte ich zum Beispiel zwischen den beiden Punkten ein Entity anzeigen. Sagen wir mal einen Zylinder mit dem Radius 1 und der Länge entsprechend dem Abstand der beiden Punkte. Wie ich den Abstand berechne ist mir klar, wie ich dann den Mittelpunkt dieser "Linie" errechne auch, aber wie kann ich die Rotation für den Befelt EntityRotate() errechnen ?

Hat jemand da eine Idee ? Ich komme nicht weiter.

Vielen Dank im Voraus.
---
Windows 11 (64 bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Punkte im 3D Raum Winkel errechnen

Beitrag von STARGÅTE »

Dafür gibt es doch: EntityLookAt() dort gibst du die Koordinaten von Punkt V2 ein, nachdem du das Entity verschoben hast.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: 2 Punkte im 3D Raum Winkel errechnen

Beitrag von Makke »

Wie immer danke für den Tip, man muss nur noch das Entity (in meinem Fall) um 90 ° drehen, dann klappts auch. Hier ein kleines Beispiel:

Code: Alles auswählen

EnableExplicit

Structure fQuaternion
  x.f
  y.f
  z.f
  w.f
EndStructure

Structure fVector3
  x.f
  y.f
  z.f
EndStructure

Define.f           distance1, distance2
Define.i           tempTexture, tempMaterial, tempMesh, camera, light, entPoint1, entPoint2, entPoint3, entPoint4, entLine1, entLine2, meshHelpline
Define.fVector3    point1, point2, point3, point4, linecenter1, linecenter2
Define.fQuaternion helpline

; init
InitEngine3D()
InitSprite()
InitKeyboard()

OpenWindow(0,0,0,1024,768,"Winkel zwischen zwei Punkten",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0, #PB_Screen_WaitSynchronization)

MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)

; create line entities
tempTexture = CreateTexture(#PB_Any, 1, 1)
StartDrawing(TextureOutput(tempTexture))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,1,1,RGBA(255,255,0,192))
StopDrawing()

tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
MaterialShadingMode(tempMaterial, #PB_Material_Phong)
MaterialBlendingMode(tempMaterial, #PB_Material_AlphaBlend)

tempMesh = CreateCylinder(#PB_Any, 1, 1)

entLine1 = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial))

tempTexture = CreateTexture(#PB_Any, 1, 1)
StartDrawing(TextureOutput(tempTexture))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,1,1,RGBA(255,0,255,192))
StopDrawing()

tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
MaterialShadingMode(tempMaterial, #PB_Material_Phong)
MaterialBlendingMode(tempMaterial, #PB_Material_AlphaBlend)

entLine2 = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial))

; create entities for point positions
tempTexture = CreateTexture(#PB_Any, 1, 1)
StartDrawing(TextureOutput(tempTexture))
Plot(0,0,RGB(0,255,128))
StopDrawing()

tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
MaterialBlendingMode(tempMaterial, #PB_Material_Phong)

tempMesh = CreateSphere(#PB_Any, 4)

entPoint1 = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial))
entPoint2 = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial))

tempTexture = CreateTexture(#PB_Any, 1, 1)
StartDrawing(TextureOutput(tempTexture))
Plot(0,0,RGB(0,128,255))
StopDrawing()

tempMaterial = CreateMaterial(#PB_Any, TextureID(tempTexture))
MaterialBlendingMode(tempMaterial, #PB_Material_Phong)

entPoint3 = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial))
entPoint4 = CreateEntity(#PB_Any, MeshID(tempMesh), MaterialID(tempMaterial))

; create light
light = CreateLight(#PB_Any, RGB(225, 225, 225), 0, 250, 0, #PB_Light_Directional)
LightLookAt(light, 0,0,0)

; create camera
camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera, 0, 200, 0, #PB_Absolute)
RotateCamera(camera, -90, 0, 0, #PB_Relative)

AmbientColor(RGB(32,32,32))

FreeMesh(tempMesh)
FreeMaterial(tempMaterial)
FreeTexture(tempTexture)

; create the two points
point1\x = -100
point1\y = 0
point1\z = 0
point2\x = 50
point2\y = -20
point2\z = -50
MoveEntity(entPoint1, point1\x, point1\y, point1\z, #PB_Absolute)
MoveEntity(entPoint2, point2\x, point2\y, point2\z, #PB_Absolute)

point3\x = -50
point3\y = -20
point3\z = -50
point4\x = 50
point4\y = 50
point4\z = 50
MoveEntity(entPoint3, point3\x, point3\y, point3\z, #PB_Absolute)
MoveEntity(entPoint4, point4\x, point4\y, point4\z, #PB_Absolute)

; calc center point and distance
linecenter1\x = (point1\x + point2\x) / 2
linecenter1\y = (point1\y + point2\y) / 2
linecenter1\z = (point1\z + point2\z) / 2
MoveEntity(entLine1, linecenter1\x, linecenter1\y, linecenter1\z, #PB_Absolute)

distance1 = Sqr(Pow(point1\x - point2\x, 2) + Pow(point1\y - point2\y, 2) + Pow(point1\z - point2\z, 2))
ScaleEntity(entLine1, 1, distance1, 1, #PB_Relative)
EntityLookAt(entLine1, point1\x, point1\y, point1\z)
RotateEntity(entLine1, 90, 0, 0, #PB_Relative)

linecenter2\x = (point3\x + point4\x) / 2
linecenter2\y = (point3\y + point4\y) / 2
linecenter2\z = (point3\z + point4\z) / 2
MoveEntity(entLine2, linecenter2\x, linecenter2\y, linecenter2\z, #PB_Absolute)

distance2 = Sqr(Pow(point3\x - point4\x, 2) + Pow(point3\y - point4\y, 2) + Pow(point3\z - point4\z, 2))
ScaleEntity(entLine2, 1, distance2, 1, #PB_Relative)
EntityLookAt(entLine2, point4\x, point4\y, point4\z)
RotateEntity(entLine2, 90, 0, 0, #PB_Relative)

; this does not work
; meshHelpline = CreateLine3D(#PB_Any, point3\x, point3\y, point3\z, RGB(255,255,255), point4\x, point4\y, point4\z, RGB(255,255,255))
; FetchOrientation(MeshID(meshHelpline))
; helpline\x = GetX()
; helpline\y = GetY()
; helpline\z = GetZ()
; helpline\w = GetW()
; SetOrientation(EntityID(entLine2), helpline\x, helpline\y, helpline\z, helpline\w)

Repeat
 
  While WindowEvent() : Wend
 
  ExamineKeyboard()
 
  RenderWorld()
  FlipBuffers()
 
Until KeyboardReleased(#PB_Key_Escape)

End
---
Windows 11 (64 bit)
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: 2 Punkte im 3D Raum Winkel errechnen

Beitrag von TheCube »

Läuft das Codebeispiel fehlerfrei ?
Bei MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8 )
bekomme ich einen "Invalid Memory Access (Read Adr. $00)" Ich nutze PB5.11

Kenn mich mit dem 3D-Krams nicht aus, würde aber raten: Material noch nicht initialisiert.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: 2 Punkte im 3D Raum Winkel errechnen

Beitrag von Makke »

Habs ausprobiert, funktioniert bei mir, die Funktion nutze ich immer so, ich meine das mal irgendwo gelesen zu haben. In der Anleitung steht es zumindest nicht.
---
Windows 11 (64 bit)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: 2 Punkte im 3D Raum Winkel errechnen

Beitrag von Chimorin »

Hmm, meiner Meinung nach filtert die Funktion immer das Material mit dem Wert, den #PB_Default besitzt. Oder irre ich mich da? Das wäre eine Frage an die Entwickler im engl. Forum :)
Bild

- formerly known as Bananenfreak -
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: 2 Punkte im 3D Raum Winkel errechnen

Beitrag von TheCube »

Problem gefunden/erledigt:
InitEngine3D() schlägt fehl (Debug =0)
Mein älteres XP auf´m Testrechner fand wohl keine DX9-Engine3D.dll :roll:
Antworten