[Java3D] Assen naar de maan

Pagina: 1
Acties:

  • Funcracker
  • Registratie: Juni 2001
  • Laatst online: 28-04 18:17

Funcracker

The LedZ Collective

Topicstarter
Ik heb een hele mooie boom van (Transform)Groups en aan een bepaalde subtree hierin hangt een MouseBehavior object. Deze zorgt ervoor dat ik de 3d objecten die eronder hangen mooi met de muis kan bewegen in mijn viewer. In totaal hangen er wel 2 3D objecten eronder en ook dit 2de object (zijn TransformGroup) heeft een MouseBehavior aan zich hangen.
Beide worde enkel geactiveerd als ik ook nog een specifieke toets op het keyboard indruk dus ze interferen niet met elkaar.

Als ik nu de bovenste transformgroup (boom met root boven en knopen/bladeren naar beneden) ga transleren bewegen beide objecte mee. Als ik de onderste ga transleren (met de muis dus) beweegt alleen het object dat hier direct onder hangt.
Tot zover precies zoals het zou moeten. Alleen is het probleem dat wanneer ik de bovenste heb getransleerd/geroteerd etc het virtuele assenstel ook meegaat. Dit houdt in dat wanneer ik het lagere object wil transleren het object niet mooi met mijn muis meegaat, maar volgens het oude (nu dus veranderde) assenstelsel gaat bewegen. Hierdoor is de coordinatie ervan onmogelijk.

Dit wil ik dus loskoppelen en dat kan goed door ze naast elkaar in de boom te hangen, maar is het mogelijk om er dan nog een extra object boven te hangen dat beide objecten kan bewegen, maar het assenstelsel houdt zoals het is?
Want anders kan ik vervolgens beide objecten niet meer logisch manouvreren.

Iemand een oplossing waar ik verder mee kan?

I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ik ken Java3D verder niet, maar in OpenGL gebruik je hiervoor pop/pushmatrix, die ervoor zorgen dat de oorspronkelijke cameramatrix behouden blijft, zodat je per object je matrix kunt modifyen, je object kunt renderen en daarna je cameramatrix weer terug kunt krijgen. Wellicht ondersteunt Java3D ook iets van matrixbehoud, bv via een pop/push mechanisme

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Funcracker
  • Registratie: Juni 2001
  • Laatst online: 28-04 18:17

Funcracker

The LedZ Collective

Topicstarter
Hmmz, dat klinkt heel aardig in de goede richting..
Zie alleen niet direct of dat ook in Java3D mogelijk is en hoe..

Helaas zijn er ook niet zoveel Java3D programmeurs onder de tweakers alhier :/

I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

EfBe schreef op 17 december 2002 @ 16:08:
Ik ken Java3D verder niet, maar in OpenGL gebruik je hiervoor pop/pushmatrix, die ervoor zorgen dat de oorspronkelijke cameramatrix behouden blijft, zodat je per object je matrix kunt modifyen, je object kunt renderen en daarna je cameramatrix weer terug kunt krijgen. Wellicht ondersteunt Java3D ook iets van matrixbehoud, bv via een pop/push mechanisme


kort maar krachtig: nee :) Java3D werkt totaal niet op deze manier

Funcracker:: ik snap eigenlijk niet echt hoe het assenstelsel verandert als je alleen transleert :? Dat is pas als er een rotatie of schaling plaatsvindt

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Funcracker
  • Registratie: Juni 2001
  • Laatst online: 28-04 18:17

Funcracker

The LedZ Collective

Topicstarter
.oisyn schreef op 17 december 2002 @ 17:59:
Funcracker:: ik snap eigenlijk niet echt hoe het assenstelsel verandert als je alleen transleert :? Dat is pas als er een rotatie of schaling plaatsvindt
Klopt. Dat had ik er niet duidelijk bij gezet.
Als ik roteer of scale, gaat het transleren van het lagere, 2de object, dus niet zoals ik wil. Het coordinatenstelsel is dan meegedraaid/gescaled en dat maakt het goed coordineren van de beweging heeel erg lastig..

Is daar wel een oplossing voor .oisyn (of anderen uiteraard)?

I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wellicht (weer wilde gok) zit het hem in het feit dat je wellicht local coordinate systems gebruikt bij je objects, en Java3D een global coordinate system. Dit houdt in dat je niet via een global coordinate system naar de wereld kijkt, maar dat ieder object zn eigen assenstelsel heeft. Dit laatste wordt veel gebruikt bij 3D engines, want het is erg makkelijk objects in de wereld te plaatsen: alle objects zitten initieel op (0,0,0) en je transleert/roteert het assenstelsel tijdelijk naar de plek waar het object moet komen, tekent dan het object alsof het op 0,0,0 staat en popped je oude matrix weer van de stack, zodat je weer opnieuw een ander object in de willekeurige ruimte kunt plaatsen. Nadeel hiervan is dat je veel matrices moet poppen en pushen en dat kan ook weer traag zijn. Wellicht gebruik jij local coordinate systems terwijl je global moet gebruiken (dus alle coordinates moeten relatief zijn aan een fixed 0,0,0 point en je kunt niet objects relatief aan hun eigen axis tekenen.

Maar het lijkt me echt sterk dat Java3D slechts een global axis stelsel zou ondersteunen zonder cameramatrix behoud.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Funcracker
  • Registratie: Juni 2001
  • Laatst online: 28-04 18:17

Funcracker

The LedZ Collective

Topicstarter
Elke TransformGroup (die dus in een boom aan elkaar zijn gelinkt) heeft zijn eigen coordinatenstelsel. Dat is dus idd lokaal. Maar omdat het lagere object onder de TransformGroup van het hogere object hangt draait deze dus mee in dat stelsel. En daarbinnen kan ik hem dus ook aanpassen. Dat is dus het probleem.
Als ik ze naast elkaar hang heb ik dat niet, maar dan is er met de applicatie niet meer te werken. Ik wil dus eigenlijk wel het object roteren maar niet het coordinatenstelsel van de TransformGroup..

En ik weet niet of dat mogelijk is..

I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

EfBe schreef op 18 december 2002 @ 11:37:
Maar het lijkt me echt sterk dat Java3D slechts een global axis stelsel zou ondersteunen zonder cameramatrix behoud.


Zoals ik al zei, dit is totaal niet hoe Java3D werkt. Alles zit in een scenegraph, wat een hierarchische structuur is van de wereld

De root node heeft gewoon het normale assenstelsel en als oorsprong (0, 0, 0). In de boom kun je allerlei objecten hangen met evt. een bepaalde transformatie. Zoals bij elke hierarchische transform erft een child node de transformatie van z'n parent, en doet daar nog eens bovenop zijn eigen transformatie.

Ook de camera hangt ergens in die boom, en dit is het punt waaruit je kijkt (uiteraard ;)). Om een transformatie te krijgen van een object ten opzichte van de camera zul je in de boom vanuit de camera omhoog moeten bewegen, waarbij je een matrix bijhoudt die je vermenigvuldigt met de inverse van de transformatie van elke node (de inversie omdat je van beneden naar boven beweegt).

Op een gegeven moment kom je bij een node waar het object ook een (grand-)child van is. Vanaf daar beweeg je naar beneden naar het object en vermenigvuldig je je matrix weer met alle transformatiematrices (dit keer dus niet de inverse)

Zo zit java3d in elkaar, en dus niet met matrix stacks die je zelf kunt pushen en poppen.
Funcracker schreef op 18 december 2002 @ 11:43:
Elke TransformGroup (die dus in een boom aan elkaar zijn gelinkt) heeft zijn eigen coordinatenstelsel. Dat is dus idd lokaal. Maar omdat het lagere object onder de TransformGroup van het hogere object hangt draait deze dus mee in dat stelsel. En daarbinnen kan ik hem dus ook aanpassen. Dat is dus het probleem.
Als ik ze naast elkaar hang heb ik dat niet, maar dan is er met de applicatie niet meer te werken. Ik wil dus eigenlijk wel het object roteren maar niet het coordinatenstelsel van de TransformGroup..

En ik weet niet of dat mogelijk is..
wat je kunt doen is een extra TransformGroup als parent van je object in de boom hangen die het tegengestelde is van de rotatie van de bovenste TransformGroup. Het object beweegt dan gewoon met de transformatie van de bovenste TransformGroup, maar het assenstelsel wordt teniet gedaan omdat je die weer goed zet

Je kunt het zien als een tank: daarvan moet de turret altijd in dezelfde richting draaien, zelfs als de tank zelf draait. Dat wordt gerealizeerd door in de tegengestelde richting te draaien als waarop de tank draait

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
oisyn: ok, ik begrijp het. Inderdaad, als het een scenegraph is, dan zit er niets anders op dan via inverse matrices de acties te doen. Zoals ik al zei, ik weet niets van Java3D :P

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1