@edapx wrote:
Hi, I'm trying to build an L-System in 3d with OF. In order to do this, i generate a mesh, I apply a transformation to it, and i draw the mesh. The problem is that after transforming the mesh a couple of times, i want to go back to the original position. How can I achieve this?
I've triedofPushMatrix
andofPopMatrix
, but they are not working as expected, once i pop the matrix out, the position is not where I left it before.That's the code that decide which transformation to apply to the mesh:
void Transformer::generate(ofVboMesh& mesh, string _instruction, int depth) { instructions = _instruction; for (int i = 0; i < instructions.length(); i++) { char c = instructions[i]; if (c == 'F') { addBranchIntoMesh(branch, mesh, length, "cube"); transform.translate(0, 0, length); branch.setCurrentTransform(transform); }else if( c == 'G') { transform.translate(0, 0, length); branch.setCurrentTransform(transform); }else if (c == '+') { transform.rotate(+theta, 0, 1, 0); branch.setCurrentTransform(transform); } else if (c == '-') { transform.rotate(-theta, 0, 1, 0); branch.setCurrentTransform(transform); } else if (c == '[') { branch.setCurrentTransform(branch.getCurrentTransform()); ofPushMatrix(); } else if (c == ']') { ofPopMatrix(); } } currentDepth++; } void Transformer::addBranchIntoMesh(Branch branch, ofVboMesh& mesh, float length, string geometry){ if(geometry == "cube") { cube.generate(mesh, currentDepth, length, branch.getCurrentTransform()); } }
The Branch class simply store the previous transformation and get the current one
#pragma once #include "ofMain.h" class Branch { public: Branch( const ofMatrix4x4& currentTransform = ofMatrix4x4() ); ofMatrix4x4 currentTransform; ofMatrix4x4 getCurrentTransform() const { return currentTransform; } void setCurrentTransform(const ofMatrix4x4& transform) { this->currentTransform = transform; } };
The cube class, take the general mesh (the mesh that will contain all the cubes), and put into it a cube, a the position specified by the transformation.
void Cube::generate(ofMesh& mesh, int depth, unsigned int length, ofMatrix4x4 transformation){ ofColor color(255, 0, 0); float hue = 254.f; vertices = createCube(length); // for the sake of brevity i will not include the createCube ;) for (unsigned i = 0; i < vertices.size(); ++i){ mesh.addVertex(vertices[i] * transformation); mesh.addNormal(normals[i]); mesh.addTexCoord(ofVec2f(0.f, depth)); mesh.addColor(color); } }
I'm also not sure if ofMatrix4x4 fits my needs, that is basically move a turtle back and forth on the screen and drawing a mesh where is it needed.
Any suggestion is more than appreciated!
Posts: 4
Participants: 2