#1 24.08.2005 18:03:54

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Dicke eines Korpers

Hi.
Ich hatte eigentlich vor, für jeden Vertex zu berechnen, wieviel Abstand er bis zum nächsten hat, um damit einen Wert für die Dicke des Körpers an dieser Stelle zu bekommen.
Dazu hab ich mir ein Richtungsvektor genommen, der angibt, von welche Richtung der Körper betrachtet wird. Denn von jeder Perspektive aus ist ja ein Körper dicker bzw. dünner. Bsp: Ich habe einen Zylinder, der 10cm dick und 100cm hoch ist. Wenn ich von oben drauf schaue hat der ne Dicke von 100cm und wenn ich von der Seite drauf schaue nur noch eine von 10cm. .. Nur so fürs Verständnis  wink

So. Nun zu ech. Wie würdet ihr diese Dicke berechnen. Ich nehme an für pre1.4 Shader gibts da keine nützlichen Befehle und Algos  big_smile , weshalb das ganze wohl Software laufen soll.

Schon mal nen Dank im Voraus ...  :tia:


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#2 24.08.2005 19:59:09

@uzingLG
Member
Registriert: 01.05.2005
Beiträge: 94

Re: Dicke eines Korpers

Du könntest die Kollisionsfunktionen dafür verwenden. Berechne die Kollision mit einem Strahl in die Blickrichtung und speichere den Punkt, an dem der Strahl das Modell berührt. Dann verschiebst du den "Strahlungswinkel" ans andere Ende der Boundingsphere und testest von dort aus in Blickrichtung. Dann berechnest du die Distanz zwischen den beiden Punkten.

Offline

 

#3 24.08.2005 20:58:15

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Dicke eines Korpers

Ist schon ne etwas andere Rangehensweise ... blos ich muss es ja für jeden (sichtbaren) Vertex machen.


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#4 25.08.2005 07:05:23

Back in Time
ProMember
Registriert: 08.04.2005
Beiträge: 130

Re: Dicke eines Korpers

Genau das musst Du. Mit Dicke meinst Du die Tiefe oder die Breite?!?

Je nachdem bleibt Dir wohl nichts anderes übrig, als die Vertices komplett zu transformieren (Worldmat * ViewMat) und dann den höchsten Z- bzw. X-Unterschied herauszufiltern.


If we would understand it we wouldn't call it code.

Offline

 

#5 25.08.2005 07:29:49

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Dicke eines Korpers

Was ist den bei dir die Dicke?
(wozu hat man nen TabletPC....schnell bild mal...)
http://www-users.rwth-aachen.de/Martin.Weusten/upload/bild.jpg

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#6 25.08.2005 07:41:16

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Dicke eines Korpers

Vielleicht hilft dir der hier beschriebene Algorithmus:
http://www-i8.informatik.rwth-aachen.de/teaching/ss05/datalg/downloads/PDF/2.7.3-nachbarschaften.pdf
(600 kb, Seite 26, "Weitester Abstand")

Edit:
Die Konvexe-Hülle bekommst du z.B. mit einem dieser Algorithmen mit O(n * log n)
http://www-i8.informatik.rwth-aachen.de/teaching/ss05/datalg/downloads/PDF/2.7.2-konvexe-huelle.pdf

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#7 25.08.2005 08:31:36

Back in Time
ProMember
Registriert: 08.04.2005
Beiträge: 130

Re: Dicke eines Korpers

Mit CamPos und LookVektor hast Du Gerade...
Von jedem Vertex Lotpunkt zur Geraden bestimmen. Höchster Abstand 2er Lotpunkte ist Deine Dicke. Zumindest in etwa. Präzisere Möglichkeit wäre die Gerade von CamPos durch den Mittelpunkt Deines Objektes zu nehmen...

Wie präzise brauchst Du die "Dicke" denn?


If we would understand it we wouldn't call it code.

Offline

 

#8 25.08.2005 12:12:00

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Dicke eines Korpers

@Coolcat: So früh am Morgen versteh ich das eine Paper noch nicht. Ich hab nur was von Nachbarschaften gefunden (damit gibts du mir gleich was, was ich woanders gebrauchen könnte) aber jetzt auf Anhieb nix mit der festgelegten Richtung. Ich schau heut nochmal rein.

@Back in Time: Wie bestimme ich denn den Lotpunkt zur Geraden? Wäre das nicht automatisch die Normale?

Ich hab auch mal ein winziges Bild gemalt, was ich unter der Dicke verstehe. das rote Kreuz ist die Kamera und die Länge der blauen Striche ist sozusagen die Dicke, für mich.


Attachments:
Attachment Icon Dicke.jpg, Größe: 36,798 bytes, Downloads: 409

Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#9 25.08.2005 12:48:48

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Dicke eines Korpers

Also ich glaube diese Berechnung wird ziemlich komplex, vielleicht brauchst du das ja garnicht berechnen...wenn du uns mal (endlich :p ) sagen würdest was du eigentlich machen willst, könnte man da vielleicht etwas effektiver rangehen...

Reden wir eignetlich von einem 2D-Objekt oder einem 3D-Objekt?

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#10 25.08.2005 15:41:53

@uzingLG
Member
Registriert: 01.05.2005
Beiträge: 94

Re: Dicke eines Korpers

Aha. Da musst du anders als von mir oben empfohlen vorgehen, ich habe geblaubt, du willst nicht nur bis zum Loch, sondern das Loch ignorieren. Du fängst bei der Kamera an. Vom 1. Schnittpunkt ausgehend machst du weiter und überprüfst jedes mal das berührte Dreieck: Wenn es von dir wegschaut, hast du ein anderes "Ende" erreicht.

Offline

 

#11 25.08.2005 15:53:52

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Dicke eines Korpers

@uzingLG: Jo so dachte ich mir das auch .. aber es sind bei mir immer Artefakte entstanden.

@Coolcat: Noch nicht  :mrgreen:

Es gibt da so eine Funktion, die mir einen Buffer voller Treffpunkte ausspuckt - D3DXIntersect. Aber ich bekomm leider ne EAccessViolation.
(zuerst Variablen zum Verständniss)

Code: delphi

  pmesh.pmesh: pid3dxmesh;
  bhit: longbool;
  iface,ihits: cardinal;
  u,v,fd: single;
  hitbuffer: id3dxbuffer;


(und der Fehlercode)

Code: delphi

   d3dxvec3subtract( vec1, pvertices.ppos, engine.camera.eye );
   try
    hres := d3dxintersect( id3dxbasemesh(pmesh.pmesh^), @engine.camera.eye, 
                           @vec1, bhit, iface, u, v, fd, hitbuffer, ihits );
   except
    if hres = e_outofmemory then errormessage( 'E_OUTOFMEMORY', true );
    if hres = d3d_ok        then errormessage( 'D3D_OK', true );
   end;



Die Funktion liefer D3D_OK zurück, aber trotzdem die Exception.
Ich glaube es liegt an HitBuffer, da der beim Aufruf der Funktion noch nil ist. Ist aber keine Klasse, sodass ich .Create aufrufen könnte.


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#12 25.08.2005 16:39:42

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Dicke eines Korpers

Versuch mal ID3DXBaseMesh(pMesh.pMesh), also nicht dereferenzieren....aber ich weiß natürlich nich wie Ampaze das implementiert hat.


My software never has bugs. It just develops random features.

Offline

 

#13 26.08.2005 14:15:49

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Dicke eines Korpers

Geht leider auch nicht .. hab so viele compilierbare Versionen probiert, aber keine funktioniert.
Ich denke demzufolge einfach mal, dass es nicht am ersten Parameter liegen wird. Mehr Bedenken hab ich bei den HitBuffer  :rock:


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#14 26.08.2005 14:45:55

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Dicke eines Korpers

Die Funktion läuft jetzt schon mal. Ich musste vom PID3DXMesh auf ID3DXBaseMesh umstellen, ging aber recht schnell.
Das Ergebnis sieht aber irgendwie noch kacke aus .. ich muss morgen mal prüfen, ob denn die Distanzen korrekt sind.


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson