[work 2] wavy wireframe and vertices
Movie
Source code
about
- 三角形のワイヤーフレームと頂点が混在した600×300の面を生成
- 各点のz座標をパーリンノイズを使用して変化させる
- z座標の値をHSBのHにマッピングさせる
- z座標の値でワイヤーフレームか頂点のみかを変化させる
- ofRotateで座標系を回転させる
file
- 上部にあるファイル名が表示されているボタンを押すと、表示されるファイルが切り替わります
- 別ウィンドウ表示したい時や行番号などが無いRawMode表示したい時は、コード内右上のボタンを押してください(ボタンはマウスオーバーすると表示されます)
#include "ofMain.h" #include "ofApp.h" //======================================== int main( ){ // 4K:4096x2160 // 2K:2048x1080 // FullHD:1920x1080 // HD:1440x1080 // HD720p:1280x720 // DVD:720x480 ofSetupOpenGL(1280,720, OF_WINDOW); // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp( new ofApp()); }
#pragma once #include "ofMain.h" #include "Landscape.hpp" class ofApp : public ofBaseApp{ public: ofApp(); ~ofApp(); void setup(); void update(); void draw(); void keyPressed(int key); void keyReleased(int key); void mouseMoved(int x, int y); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(int x, int y, int button); void mouseEntered(int x, int y); void mouseExited(int x, int y); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); private: ofEasyCam cam; Landscape *land; float degX; float degY; float degZ; };
#include "ofApp.h" ofApp::ofApp(){ land = new Landscape(); degX = 0; degY = 0; degZ = 0; } ofApp::~ofApp(){ delete land; } //-------------------------------------------------------------- void ofApp::setup(){ double fps = 30; unsigned int recSec = 30; ofBackground(0, 0, 0); ofSetBackgroundAuto(true); // clear frame:true ofSetFrameRate(fps); land->setup(); } //-------------------------------------------------------------- void ofApp::update(){ land->update(); } //-------------------------------------------------------------- void ofApp::draw(){ cam.begin(); ofRotateXDeg(degX); ofRotateYDeg(degY); ofRotateZDeg(degZ); degX += 1.5; degY += 1.0; degZ += 0.5; land->draw(); cam.end(); }
#ifndef Landscape_hpp #define Landscape_hpp #include <stdio.h> #include "ofMain.h" class Landscape { public: Landscape(); ~Landscape(); void setup(); void update(); void draw(); private: ofMesh mesh; int cell_size; int w, h; int land_xoff, land_yoff; int rows, cols; float xoff, yoff, zoff; std::vector<std::vector<float>> z; int min_z, max_z; }; #endif /* Landscape_hpp */
#include "Landscape.hpp" Landscape::Landscape() { cell_size = 10; w = 600; h = 400; min_z = -200; max_z = 200; } Landscape::~Landscape() { } void Landscape::setup() { cols = w / cell_size; rows = h / cell_size; land_xoff = -(w / 2); land_yoff = -(h / 2); z = std::vector<std::vector<float>>(rows, std::vector<float>(cols, 0)); zoff = 0; } void Landscape::update() { yoff = 0; for (int i = 0; i < rows; i ++) { xoff = 0; for (int j = 0; j < cols; j++) { z[i][j] = ofMap(ofSignedNoise(xoff, yoff, zoff), -1, 1, min_z, max_z); xoff += 0.01; } yoff += 0.01; } zoff += 0.01; } void Landscape::draw() { ofTranslate(land_xoff, land_yoff, 0); ofColor c = ofColor(0); for (int x = 0; x < (cols - 1); x++) { for (int y = 0; y < (rows - 1); y++) { int x0 = x * cell_size; int y0 = y * cell_size; mesh.addVertex(ofVec3f(x0, y0, z[y][x])); mesh.addVertex(ofVec3f(x0, y0 + cell_size, z[y+1][x])); mesh.addVertex(ofVec3f(x0 + cell_size, y0 + cell_size, z[y+1][x+1])); mesh.addVertex(ofVec3f(x0 + cell_size, y0, z[y][x+1])); c.setHsb(ofMap(z[y][x], min_z, max_z, 0, 255), 255, 255); mesh.addColor(c); c.setHsb(ofMap(z[y+1][x], min_z, max_z, 0, 255), 255, 255); mesh.addColor(c); c.setHsb(ofMap(z[y+1][x+1], min_z, max_z, 0, 255), 255, 255); mesh.addColor(c); c.setHsb(ofMap(z[y][x+1], min_z, max_z, 0, 255), 255, 255); mesh.addColor(c); mesh.setMode(OF_PRIMITIVE_TRIANGLES); mesh.addIndex(0); mesh.addIndex(1); mesh.addIndex(2); mesh.addIndex(0); mesh.addIndex(2); mesh.addIndex(3); if (z[y][x] <= 0) { mesh.drawWireframe(); } else { mesh.drawVertices(); } mesh.clear(); } } }
Link to the API reference page
ソースコードで使用したAPIの中から要点になりそうなものをいくつか選んでリストアップしました。
category | API |
openframeworks | ofMath ofSignedNoise |
openframeworks | ofMesh drawWireframe |
openframeworks | ofMesh drawVertices |