//-------------------------------------------------------------- void ofApp::drawBranch(int depth, float angle) { float newAngle = angle + angleOffset; ofPushMatrix(); ofRotate(newAngle); drawLeaf(depth, newAngle); ofPopMatrix(); ofRotate(-newAngle); drawLeaf(depth, newAngle); }
void Tree::drawTree() { int ii=0,countF=0; addressF=basicUnitList.begin(); //FF[F[F]F]FFF glRotatef(90.0,-1.0,0.0,0.0); for(int i=0;i<simpleStringF.length();i++) { if (simpleStringF[i]=='[') { glPushMatrix(); } else if (simpleStringF[i]==']') { glPopMatrix(); } else //simpleStringF[i]=='F' { countF++; //生成随机颜色 glColor3ub(color[countF%2][0],color[countF%2][1],color[countF%2][2]); if (addressF->angleZ!=0) glRotatef(addressF->angleZ,0.0,0.0,addressF->angleZ); if (addressF->angleY!=0) glRotatef(addressF->angleY,0.0,addressF->angleY,0.0); if (addressF->angleX!=0) glRotatef(addressF->angleX,addressF->angleX,0.0,0.0); drawSegment(addressF->redius,addressF->length); if (addressF->leafAmount) { drawLeaf(addressF->leafArea[0],addressF->length); drawLeaf(addressF->leafArea[0],addressF->length-0.35); } addressF++; } } //drawLeaf(1,1); }
void drawGreen(void) { mvstack.push(model_view); set_colour(.1, .4, .1); model_view *= Scale (10, 7, 12); model_view *= RotateX(-90); drawLeaf(); model_view = mvstack.pop(); }
// Draws 3 leaves around the end of a branch.. once upon a time void terminatingLeaf(void) { if (!drawLeaves) { return; } // if if ( (rand() % 100) < 2) { drawFruit(); } else { pushMatrix(); rotateBy( (rand() % 90), 0, 0, 1); rotateBy( -(rand() % 10), 0, 1, 0); drawLeaf(); popMatrix(); } // if-else } // terminatingLeaf
// Drawing a single tree void drawTree(double heightScale, double widthScale, double xLoc, double yLoc, double zLoc) { ErrCheck("Before drawTree"); glPushMatrix(); //Everything is rotated, so it is weird coordinates glTranslated(xLoc, zLoc, yLoc); //Make sure everything is the right height glScaled(widthScale, heightScale, widthScale); //Draw Cylinder; double treeWidth = (rand()%40+80)/300.0; //Gets a tree trunk around .4 double treeHeight = (rand()%30+100)/20.0; //gets a tree height around 4 glTranslated(0,treeHeight, 0); //Brings the bottom of the tree to zero //Rotate the tree so they don't all look the same glRotated(rand()%360,0,1,0); double treeColor[] = {210.0/255, 105.0/255, 30.0/255}; cylinder::drawCylinder(treeWidth, treeHeight, 60, treeColor, treeTexture, logEndTexture, true); double currentAngle = 0; glTranslated(0,treeHeight*.05, 0); //Moves just above the cylinder while(currentAngle < 720) //Draws three things of leaves { glPushMatrix(); if(currentAngle > 360) { glTranslated(0, -.05, 0); } double thisLeafAngle = rand()%20+40;//Gets an angle between 20 and 40 double leafScaleX = (rand()%10+90)/25; //Changes size a little bit double leafScaleY = (rand()%10+90)/25; //Changes size a little bit double leafScaleZ = (rand()%10+90)/25; //Changes size a little bit glScaled(leafScaleX, leafScaleY * thisLeafAngle/30.0, leafScaleZ); glRotated(currentAngle, 0, 1, 0); glRotated(-(rand()%6+27), 0, 0, 1); //random angle for the pitch glRotated(-(rand()%5-2.5), 1, 0, 0); //Rotates the leaf a bit drawLeaf(); glPopMatrix(); currentAngle += thisLeafAngle; } glPopMatrix(); ErrCheck("After drawTree"); }
void TurtleRenderer::parseSystem() { m_stack = std::stack<glm::mat4>(); m_stack.push(glm::mat4(1.0f)); std::stack<Node*> branchStack; std::string path = m_system->generate(); //std::cout << "Word: " << path << std::endl; float angle = m_system->definition()->angle; glm::mat4 m; glm::vec3 right, up, forward; Node * parent = m_root = new Node(); for (unsigned i = 0; i < path.length(); i++) { char chr = path[i]; switch (chr) { case 'X': // ignored symbol break; case 'F': parent = drawSegment(parent); m = glm::translate(m_stack.top(), glm::vec3(0.0f, length, 0.0f)); m_stack.pop(); m_stack.push(m); break; case 'Q': case 'f': parent = drawLeaf(parent); break; case '+': m = glm::rotate(m_stack.top(), angle, glm::vec3(1.0f, 0.0f, 0.0f)); m_stack.pop(); m_stack.push(m); break; case '-': m = glm::rotate(m_stack.top(), -angle, glm::vec3(1.0f, 0.0f, 0.0f)); m_stack.pop(); m_stack.push(m); break; case '!': m = glm::rotate(m_stack.top(), angle, glm::vec3(0.0f, 1.0f, 0.0f)); m_stack.pop(); m_stack.push(m); break; case '?': m = glm::rotate(m_stack.top(), -angle, glm::vec3(0.0f, 1.0f, 0.0f)); m_stack.pop(); m_stack.push(m); break; case '&': m = glm::rotate(m_stack.top(), angle, glm::vec3(0.0f, 0.0f, 1.0f)); m_stack.pop(); m_stack.push(m); break; case '/': m = glm::rotate(m_stack.top(), -angle, glm::vec3(0.0f, 0.0f, 1.0f)); m_stack.pop(); m_stack.push(m); break; case '|': m = glm::rotate(m_stack.top(), 180.0f, glm::vec3(0.0f, 0.0f, 1.0f)); m_stack.pop(); m_stack.push(m); break; case '[': m_stack.push(m_stack.top()); thickness /= thinning; branchStack.push(parent); break; case ']': m_stack.pop(); thickness *= thinning; parent = branchStack.top(); branchStack.pop(); break; default: { //Trace::info("Encountered unkown turtle command: %c\n", chr); } } } }
void display(void) { // Clear the screen with the background colour (set in myinit) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); model_view = mat4(1.0f); model_view *= Translate(0.0f, 0.0f, -15.0f); HMatrix r; Ball_Value(Arcball,r); mat4 mat_arcball_rot( r[0][0], r[0][1], r[0][2], r[0][3], r[1][0], r[1][1], r[1][2], r[1][3], r[2][0], r[2][1], r[2][2], r[2][3], r[3][0], r[3][1], r[3][2], r[3][3]); model_view *= mat_arcball_rot; mat4 view = model_view; glUniformMatrix4fv( uView, 1, GL_TRUE, view ); // Previously glScalef(Zoom, Zoom, Zoom); model_view *= Scale(Zoom); model_view *= Translate(0.0f, 0.0f, -10.0f); model_view *= RotateX(10); //if(prologue < 20) { // model_view *= Translate(0.0f, -20.0f+prologue, 0.0f); // cam_eye = vec4(rotateX, 0.0, rotateZ, 1.0); // model_view *= LookAt(cam_eye, cam_ref, cam_up); //} //if(timeline > 57) // model_view *= Translate(0.0f, -temp3, -0.0f); // Draw Scene drawScene(); // Draw Leaf if(timeline < 8.0f) { mvstack.push(model_view); model_view *= Translate(0.0f, 25.0f-prologue, 0.0f); model_view *= RotateZ(leafSway); model_view *= Translate(4.0f, -1.0f-prologue, 3.0f); drawLeaf(); model_view = mvstack.pop(); } /*/ // Draw Bee if(timeline > 35.0f && timeline < 38.0f) { mvstack.push(model_view); model_view *= Translate(15.0f-(temp2-230), pathBeeVert, 4.5f); model_view *= Scale(0.5f, 0.5f, 0.5f); drawBee(); model_view = mvstack.pop(); } /*/ //draw GFS mvstack.push(model_view); if(timeline>28&&timeline<36) { model_view *= Translate(47.5f-temp5/2, 0.0f, 3.0f); model_view*=RotateY(-90); record=40.0f-temp5/2; } else if(timeline>=36&&timeline<=40) { model_view *= Translate(7.5f, 0.0f, 4.0); model_view*=RotateY(-135); } else if(timeline>40&&timeline<59) { model_view *= Translate(7.5f+temp6/4, 0.0f, 2.0f); model_view *= RotateY(90); } if(timeline>=28) drawGFS(1,1,1); model_view = mvstack.pop(); // Draw Male mvstack.push(model_view); if(timeline > 20.0f && timeline < 24.0f) { model_view *= Translate(-5.0f+temp, 0.0f, 2.25f); prevX = -5.0+temp; } else if(timeline >= 24.0f && timeline < 27.0f) model_view *= Translate(prevX-temp, 0.0f, 2.25f); else if(timeline > 30.5 && timeline < 36.0) { model_view *= Translate(-25.0+temp2/10, -.75f, 4.5f); prevX = -25.0+temp2/10; model_view *= RotateY(90); } else if(timeline >= 35.0f && timeline < 55.0) { model_view *= Translate(prevX, -.75f, 4.5f); model_view *= RotateY(135); } drawDiaoSi(0.3f, 0.6f, .6f); model_view = mvstack.pop(); // Draw Female if(timeline > 8.0f) { mvstack.push(model_view); if(timeline < 12.0f) { model_view *= Translate(29.0f-2*timeline, -1.25f, 4.5f); model_view *= RotateY(-90); } if(timeline > 12.0f && timeline < 13.5) { model_view *= Translate(5.0f, -1.25f, 4.5f); model_view *= RotateY(-90+temp*1.25); } if(timeline > 13.5f && timeline < 40.0f || timeline > 53.75) model_view *= Translate(5.0f, 0.0f, 2.25f); if(timeline >= 40.0f && timeline < 59.0f) { model_view *= Translate(5.5f+temp6/4, -1.25f, 4.5f); model_view *= RotateY(90); } /*/ if(timeline > 50.0f && timeline < 53.75) { if(15.0f-(temp2-560)/10 > 5.0) { model_view *= Translate(15.0-(temp2-560)/10, -1.25f, 4.5f); prevY = 15.0-(temp2-560)/10; } else model_view *= Translate(prevY, -1.25f, 4.5f); if(timeline < 52.6f) model_view *= RotateY(-90); else model_view *= RotateY(-90+temp*2); } /*/ if(timeline < 59.0) drawFemale(1.0f, 0.0, 1.0f); //else // drawFemale(1.0f, 1.0f, 1.0f); model_view = mvstack.pop(); } if(timeline > 59.0) exit(0); getFPS(); glutSwapBuffers(); if(Recording == 1) FrSaver.DumpPPM(Width, Height) ; }