Box um Mesh zeichnen?

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

PacMani

Betreff: Box um Mesh zeichnen?

BeitragSo, Feb 21, 2010 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich bastele gerade an einem Level-Editor in dem man bestimmte Meshes laden und nachträglich bearbeiten kann (d.h. Größer ändern, verschieben etc.)
Um das aktive Mesh anzuzeigen, dachte ich mir, ich mache eine Box...
user posted image
und umrande dann das aktive Mesh damit in dem ich die Box auf die gleiche Größe wie das ausgewählte Mesh bringe.
Allerdings scheitere ich daran, die Box ist letztenendes viel zu groß (s. weiße Linien hinten - hier ist die Landschaft ein großes Mesh und ausgewählt, das Mesh hat auf jeden Fall eine kleinere Größe), da ich auch nicht so ganz weiß wie ich die Größe des aktiven Meshes herausfinden und übertragen soll:
user posted image

Derzeit sieht's so aus - Changer ist die besagte Umrandungsbox:
Code: [AUSKLAPPEN]
CameraPick(Camera, MX, MY)
If Picked = 0 Then
   HideEntity Changer
Else
   ShowEntity Changer
   PositionEntity Changer, EntityX(PickedEntity()), EntityY(PickedEntity()), EntityZ(PickedEntity())
   ScaleEntity Changer, 0, 0, 0
   ScaleEntity Changer, MeshWidth(PickedEntity()), MeshHeight(PickedEntity()), MeshDepth(PickedEntity())
   RotateEntity Changer, EntityPitch(PickedEntity()), EntityYaw(PickedEntity()), EntityRoll(PickedEntity())
End If
  • Zuletzt bearbeitet von PacMani am So, Feb 21, 2010 16:30, insgesamt einmal bearbeitet
 

OldSkool90

BeitragSo, Feb 21, 2010 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht geht es mit MeshHeight: https://www.blitzforum.de/help/MeshHeight
damit müsste man ja eigentlich die Höhe des Meshs herrausfinden. denke ich Wink
 

PacMani

BeitragSo, Feb 21, 2010 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze ich aber schon, s. Code Z. 8. Da kommen anscheinend viel zu große Werte heraus, wie man im Screenshot erkennen kann.

ZaP

BeitragSo, Feb 21, 2010 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz ehrlich, die Art tut ja in den Augen weh! Ich würde eine Bounding Box ermitteln, und dann mit CameraProject die einzelnen Eckpunkte der Box mit Line verbinden und anzeigen.
Starfare: Worklog, Website (download)
  • Zuletzt bearbeitet von ZaP am So, Feb 21, 2010 16:32, insgesamt einmal bearbeitet
 

PacMani

BeitragSo, Feb 21, 2010 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt logisch... nur habe ich irgendein Problem mit Line schon vorher entdeckt: bei mir wird IMMER nur die letzte Line-Anweisung in Graphics3D ausgeführt und somit ist max. nur eine Linie sichtbar :S... das ist aber ein anderes Thema...
aber geht das wirklich nicht so wie ich es mir dachte? Kann man die Größe eines Meshes nicht auf das andere übertragen?

Eingeproggt

BeitragSo, Feb 21, 2010 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bezüglich der Line-Lösung:
Zeichne die Linien nach Renderworld.

Mit dem Skalieren:
Ohne mich groß auszukennen würde ich FitMesh empfehlen.
Oder wenn du es mit Scale-Mesh machen willst musst du aus der aktuellen Größe des "Changer" und der Größe des PickedEntity einen scale-faktor ausrechnen - da ScaleEntity nunmal um einen Faktor skaliert und nicht auf absolute Größe. Oh und man beachte den Unterschied zwischen "Entity" und "Mesh"!

Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am So, Feb 21, 2010 16:35, insgesamt einmal bearbeitet

ZaP

BeitragSo, Feb 21, 2010 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, MeshWidth, MeshHeight, und MeshDepth. Aber die sind nur sehr selten genau.
Line, bzw. alle 2D Grafikbefehle werden generell nach RenderWorld und vor Flip ausgeführt, dann sollte es auch gehen. Wink
Starfare: Worklog, Website (download)
 

OldSkool90

BeitragSo, Feb 21, 2010 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Verrechne die Werte mal Folgendermaßen, dann dürfte es eigentlich gehen:
MeshBreite/BoxBreite = ScaleBreite
BoxBreite * ScaleBreite = MeshBreite
etc.etc.

EDIT:
als Code müsste das so aussehen(sry hab kein B3D sonst würd ichs testen):
Code: [AUSKLAPPEN]
ScaleEntity Box,(MeshWidth(Mesh)/MeshWidth(Box)),(MeshHeight(Mesh)/MeshHeight(Box)),(MeshDepth(Mesh)/MeshDepth(Box))

hoffe so klappt es!
  • Zuletzt bearbeitet von OldSkool90 am So, Feb 21, 2010 16:44, insgesamt 3-mal bearbeitet

Goodjee

BeitragSo, Feb 21, 2010 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
oder skalier die box mittels fitmesh auf 1,1,1
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

PacMani

BeitragSo, Feb 21, 2010 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@Eingeproggt: Ja, das ist schon peinlich, wenn man das mit RenderWorld und den Lines nicht beachtet *schäm* Embarassed Embarassed

Habe jetzt allerdings erstmal Oldskoolz Idee umgesetzt... die Größe stimmt, nur irgendwas klappt mit den Koordinaten / Mittelpunkt nicht:
user posted image
EDIT: Das liegt daran, dass der Mittelpunkt des Level-Modells nicht in der Mitte liegt :S wie soll ich dann die Box richtig positionieren?
 

OldSkool90

BeitragSo, Feb 21, 2010 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest die Box neu positionieren.

Code: [AUSKLAPPEN]
PositionEntity Box,EntityX(Mesh),EntityY(Mesh),EntityZ(Mesh)
 

PacMani

BeitragSo, Feb 21, 2010 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht ja nicht, weil der Mittelpunkt des Level-Meshes nicht in der Mitte liegt (bei der Box aber schon)....

Goodjee

BeitragSo, Feb 21, 2010 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
geh alle vertices des meshs durch und bestimme so manuell wo es anfängt und aufhört mit vertexx/y/z
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

OldSkool90

BeitragSo, Feb 21, 2010 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
ach so meinst du das hmm...das is problematisch...da bin ich überfragt und kann leider auch zeitlich grade nicht helfen, da ich weg muss^^

Noobody

BeitragSo, Feb 21, 2010 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Goodjee hat Folgendes geschrieben:
geh alle vertices des meshs durch und bestimme so manuell wo es anfängt und aufhört mit vertexx/y/z

Das beachtet aber die Skalierung und Rotierung des Entitys nicht. Daher muss man zusätzlich noch per TFormPoint die einzelnen Vertices in den globalen Raum ziehen, um dann die Start- und Endkoordinaten festzustellen. Diese Koordinaten können dann prima per FitMesh auf die Box angewandt werden.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

PacMani

BeitragSo, Feb 21, 2010 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich dachte jetzt das kann ich noch, aber da bin ich überfordert Confused

Goodjee

BeitragSo, Feb 21, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du die größe direkt nach dem laden bestimmst und abspeicherst kannst du dir das mit tformpoint auch sparen
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

PacMani

BeitragSo, Feb 21, 2010 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube ich stelle markierte Objekte einfach heller dar Very Happy
Nein im Ernst, ich weiß jetzt nicht wirklich wie ich vorgehen soll... aber ich setze mich nachher nochmal ran.

Goodjee

BeitragSo, Feb 21, 2010 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ungefähr so:

Code: [AUSKLAPPEN]

For i=1 To CountSurfaces(mesh)
   surface=GetSurface(mesh,i)
   
   For j=0 To CountVertices(surface)-1
      If(i=0 And j=0)
         minx=VertexX(surface,j)
         maxx=VertexX(surface,j)
         miny=VertexY(surface,j)
         maxy=VertexY(surface,j)
         minz=VertexZ(surface,j)
         maxz=VertexZ(surface,j)
      Else
         If(VertexX(surface,j)<minx) minx=VertexX(surface,j)
         If(VertexX(surface,j)>maxx) maxx=VertexX(surface,j)
         
         If(VertexY(surface,j)<miny) miny=VertexY(surface,j)
         If(VertexY(surface,j)>maxy) maxy=VertexY(surface,j)
         
         If(VertexZ(surface,j)<minz) minz=VertexZ(surface,j)
         If(VertexZ(surface,j)>maxz) maxz=VertexZ(surface,j)
      EndIf
   Next
Next
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

PacMani

BeitragSo, Feb 21, 2010 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Jup! Das klappt prima Very Happy vor allem weil ich meinen Kopf nicht für anstrengen musste Smile

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group