3D Editor Objekte bewegen

Heute habe ich mit dem Verschieben von Objekten im 3D Raum auseinander gesetzt.

Ziel ist es mittels Pfeilen ein Objekt auf allen 3 Achsen zu verschieben.

Zuerst brauchen wir 6 Pfeile was mit Irrlicht recht einfach geht.

[codesyntax lang=“cpp“]

u32 tesselationCylinder = 4;
u32 tesselationCone = 8;
f32 height = 1.f;
f32 cylinderHeight = 0.6f;
f32 widthCylinder = 0.05f;
f32 widthCone = 0.05f;

arrwL = smgrOrg->addAnimatedMeshSceneNode(smgrOrg->addArrowMesh("m1", SColor(255, 255, 0, 0), SColor(255, 255, 0, 0), tesselationCylinder, tesselationCone, height, cylinderHeight, widthCylinder, widthCone));
arrwR = smgrOrg->addAnimatedMeshSceneNode(smgrOrg->addArrowMesh("m2", SColor(255, 255, 0, 0), SColor(255, 255, 0, 0), tesselationCylinder, tesselationCone, height, cylinderHeight, widthCylinder,widthCone));
arrwF = smgrOrg->addAnimatedMeshSceneNode(smgrOrg->addArrowMesh("m3", SColor(255, 0, 255, 0), SColor(255, 0, 255, 0), tesselationCylinder, tesselationCone, height, cylinderHeight, widthCylinder,widthCone));
arrwB = smgrOrg->addAnimatedMeshSceneNode(smgrOrg->addArrowMesh("m4", SColor(255, 0, 255, 0), SColor(255, 0, 255, 0), tesselationCylinder, tesselationCone, height, cylinderHeight, widthCylinder,widthCone));
arrwT = smgrOrg->addAnimatedMeshSceneNode(smgrOrg->addArrowMesh("m5", SColor(255, 0, 0, 255), SColor(255, 0, 0, 255), tesselationCylinder, tesselationCone, height, cylinderHeight, widthCylinder,widthCone));
arrwD = smgrOrg->addAnimatedMeshSceneNode(smgrOrg->addArrowMesh("m6", SColor(255, 0, 0, 255), SColor(255, 0, 0, 255), tesselationCylinder, tesselationCone, height, cylinderHeight, widthCylinder,widthCone));

//Die Pfeile Drehen
arrwL->setRotation(vector3df(90, 0, 0));
arrwR->setRotation(vector3df(-90, 0, 0));
arrwB->setRotation(vector3df(-90, 90, 0));
arrwF->setRotation(vector3df(-90, -90, 0));
arrwD->setRotation(vector3df(180, 0, 0));

[/codesyntax]

Der knifflige Teil ist das Verschieben.

1. Reagieren auf das herrunterdrücken der Maus

2. Das selektierte Objekt bestimmen.

3. Der nächsten Zyklus beginnt wenn die Maus auch vollständig gedrückt ist

4. Per Ray-cast bestimmen wo die Maus exakt geklickt hat und merken

5. Im nächsten Zyklus wieder einen Raycast machen und den vorherigen davon abziehen wodurch die Distanz errechnet werden kann wie weit sich die Maus bewegt hat und in welcher Richtung im 3D Space.

6. 2 Werte der Richtung auf 0 setzen (Anhand des Selektierten Pfeils)

7. Auf die Aktuelle Position des zu verschiebenden Objektes die Distanz aufrechnen

8. Die pfile mit verschieben

9. Die Cursorposition so setzen das diese im Zentrum des selektierten Pfeils ist.

10 wieder zu 5. Bis die Maus nicht gedrückt wird

Eine Sache ist wenn QT verwendet wird das ihr einen Frame überspringen müsste wenn ihr den Cursor gesetzt habt.