前提・実現したいこと
openFrameworksでアフィン変換のプログラムを作っています。
直方体と四面体を左マウスクリックでそれぞれの中心で回転するプログラムを作ってました。
発生している問題・エラーメッセージ
例外がスローされました:読み取りアクセス違反。 pnt が 0x262DAEA でした。
該当のソースコード
main.cpp
1#include "ofMain.h" 2#include "ofApp.h" 3//======================================================================== 4int main() { 5 ofSetupOpenGL(768, 768, OF_WINDOW); 6 // this kicks off the running of my app 7 // can be OF_WINDOW or OF_FULLSCREEN 8 // pass in width and height too: 9 ofRunApp(new ofApp()); 10}
ofApp.h
1#pragma once 2#include "ofMain.h" 3class ofApp : public 4 ofBaseApp { 5public: 6 ofVec2f windowSize; 7 void setup(); 8 void update(); 9 void draw(); 10 void keyPressed(int key); 11 void keyReleased(int key); 12 void mouseMoved(int x, int y); 13 void mouseDragged(int x, int y, int button); 14 void mousePressed(int x, int y, int button); 15 void mouseReleased(int x, int y, int button); 16 void windowResized(int w, int h); 17 void dragEvent(ofDragInfo dragInfo); 18 void gotMessage(ofMessage msg); 19 ofVec3f r; 20 ofVec3f t; 21 ofVec3f preMousePos; 22};
ofApp.cpp
1#include "ofApp.h" 2#include <stdarg.h> 3//構造体 sPpolygon 型の定義 4struct sPolygon { 5 int vNum; //頂点の数 6 ofPoint vertex[10]; //頂点の座標 7 ofPoint normal; //法線ベクトル 8 ofPoint center; //中心座標 9 ofPoint max; //各軸の最大値 10 ofPoint min; //各軸の最小値 11 ofColor color; //色 12 bool visible; //可視判定 13}; 14//-------------------------------------------------------------- 15void ofApp::setup() { 16 //フレームレートの設定 17 ofSetFrameRate(30); 18} 19//-------------------------------------------------------------- 20void ofApp::update() { 21 //回転角の設定 22 // r.y = int((r.y ++)) % 360; 23 // r.x = int((r.x + 2)) % 360; 24} 25//ポリゴン作成(色,座標点配列,点の数,点番号,..) 26sPolygon makePoly(ofColor pColor, ofPoint pnt[], int num, ...) { 27 sPolygon poly; 28 va_list ptr; 29 va_start(ptr, num); 30 for (int i = 0; i < num; i++) { 31 int p = va_arg(ptr, int); 32 poly.vertex[i] = pnt[p]; 33 } 34 poly.color = pColor; 35 poly.vNum = num; 36 return poly; 37} 38//透視投影計算 39ofPoint pers(ofPoint p) { 40 float focal = -3.0; //焦点距離を設定 41 ofPoint outp; 42 outp.x = p.x * focal / p.z; 43 outp.y = p.y * focal / p.z; 44 outp.z = 0; 45 return outp; 46} 47//ポリゴンの描画(可変長引数を用いる) 48void drawPoly(sPolygon poly[], const int num) { 49 for (int i = 0; i < num; i++) { 50 ofNoFill(); 51 ofSetColor(255, 255, 255); 52 ofSetPolyMode(OF_POLY_WINDING_NONZERO); ofBeginShape(); 53 for (int j = 0; j < poly[i].vNum; j++) { 54 ofPoint p_tmp = pers(poly[i].vertex[j]); 55 ofVertex(p_tmp); 56 57 } 58 ofEndShape(); 59 } 60} 61//移動量 62void translate(ofPoint pnt[], int start, int end, float x, float y, float 63 z) { 64 for (int i = start; i <= end; i++) { 65 pnt[i].x += x; 66 pnt[i].y += y; 67 pnt[i].z += z; 68 } 69} 70//X 軸まわりの回転 71void rotateX(ofPoint pnt[], int start, int end, float rx) { 72 float rrx = rx / 180 * PI; 73 for (int i = start; i <= end; i++) { 74 ofPoint tp = pnt[i]; 75 pnt[i].x = tp.x; 76 pnt[i].y = tp.y * cos(rrx) - tp.z * sin(rrx); 77 pnt[i].z = tp.y * sin(rrx) + tp.z * cos(rrx); 78 } 79} 80//Y 軸まわりの回転 81void rotateY(ofPoint pnt[], int start, int end, float ry) { 82 float rry = ry / 180 * PI; 83 for (int i = start; i <= end; i++) { 84 ofPoint tp = pnt[i]; 85 pnt[i].x = tp.x * cos(rry) - tp.z * sin(rry); 86 pnt[i].y = tp.y; 87 pnt[i].z = tp.x * sin(rry) + tp.z * cos(rry); 88 } 89} 90//Z 軸まわりの回転 91void rotateZ(ofPoint pnt[], int start, int end, float rz) { 92 float rrz = rz / 180 * PI; 93 for (int i = start; i <= end; i++) { 94 ofPoint tp = pnt[i]; 95 pnt[i].x = tp.x * cos(rrz) - tp.y * sin(rrz); 96 pnt[i].y = tp.x * sin(rrz) + tp.y * cos(rrz); 97 pnt[i].z = tp.z; 98 } 99} 100void setViewport(ofVec2f leftTop, ofVec2f rightBottom) { 101 ofVec2f scale; 102 scale.x = ofGetWindowWidth() / (rightBottom.x - leftTop.x); 103 scale.y = ofGetWindowHeight() / (rightBottom.y - leftTop.y); 104 ofScale(scale.x, scale.y); 105 ofTranslate(-(leftTop)); 106} 107 108//-------------------------------------------------------------- 109void ofApp::draw() { 110 //描画用ビューポートの設定(左上座標,右下座標) 111 setViewport(ofVec2f(-2, 2), ofVec2f(2, -2)); 112 //背景色・描画色・塗りつぶしの設定 113 ofBackground(30, 30, 120); 114 ofSetColor(255, 255, 255); 115 ofNoFill(); 116 //モデルの座標点格納用の配列 117 ofPoint pnt[12]; 118 //直方体の頂点 119 pnt[0] = ofPoint(-1, 1.5, 0.5); 120 pnt[1] = ofPoint(-1, -1.5, 0.5); 121 pnt[2] = ofPoint(1, -1.5, 0.5); 122 pnt[3] = ofPoint(1, 1.5, 0.5); 123 pnt[4] = ofPoint(-1, 1.5, -0.5); 124 pnt[5] = ofPoint(-1, -1.5, -0.5); 125 pnt[6] = ofPoint(1, -1.5, -0.5); 126 pnt[7] = ofPoint(1, 1.5, -0.5); 127 //四面体の頂点 128 pnt[8] = ofPoint(-1, -1, 1); 129 pnt[9] = ofPoint(1, -1, -1); 130 pnt[10] = ofPoint(1, 1, 1); 131 pnt[11] = ofPoint(-1, 1, -1); 132 133 134 // アフィン変換 135 // rotateY(配列名,開始番号,終了番号,ry) 136 rotateX(pnt, 0, 11, r.x); 137 rotateY(pnt, 0, 11, r.y); 138 //translate(配列名,開始番号,終了番号,tx, ty, tz) 139 translate(pnt, 0, 11, 0, 0, -13); 140 translate(pnt, 0, 11, t.x, t.y, t.z); 141 sPolygon poly[10]; 142 ofColor color = ofColor(233, 233, 233); 143 //直方体の面 144 poly[0] = makePoly(ofColor(255, 255, 0), pnt, 4, 0, 1, 2, 3); 145 poly[1] = makePoly(ofColor(255, 255, 0), pnt, 4, 3, 2, 6, 7); 146 poly[2] = makePoly(ofColor(255, 255, 0), pnt, 4, 7, 6, 5, 4); 147 poly[3] = makePoly(ofColor(255, 255, 0), pnt, 4, 0, 4, 5, 1); 148 poly[4] = makePoly(ofColor(255, 255, 0), pnt, 4, 0, 3, 7, 4); 149 poly[5] = makePoly(ofColor(255, 255, 0), pnt, 4, 1, 5, 6, 2); 150 //四面体の面 151 poly[6] = makePoly(ofColor(255, 0, 255), pnt, 8,9,10); 152 poly[7] = makePoly(ofColor(255, 0, 255), pnt, 10,11,8); 153 poly[8] = makePoly(ofColor(255, 0, 255), pnt, 10,9,11); 154 poly[9] = makePoly(ofColor(255, 0, 255), pnt, 8,11,9); 155 156 157 drawPoly(poly, 10); 158} 159//-------------------------------------------------------------- 160void ofApp::keyPressed(int key) { 161} 162//-------------------------------------------------------------- 163void ofApp::keyReleased(int key) { 164} 165//-------------------------------------------------------------- 166void ofApp::mouseMoved(int x, int y) { 167} 168//-------------------------------------------------------------- 169void ofApp::mouseDragged(int x, int y, int button) { 170 if (button == 0) { //左クリック 171 r.y = r.y - (x - preMousePos.x) / 5; 172 r.x = r.x + (y - preMousePos.y) / 5; 173 preMousePos.x = x; 174 preMousePos.y = y; 175 } 176 else { //左クリック以外 177 t.x = t.x + (x - preMousePos.x) / 100; 178 t.z = t.z + (y - preMousePos.y) / 100; 179 } 180} 181//-------------------------------------------------------------- 182void ofApp::mousePressed(int x, int y, int button) { 183 preMousePos.x = x; 184 preMousePos.y = y; 185} 186//-------------------------------------------------------------- 187void ofApp::mouseReleased(int x, int y, int button) { 188} 189//-------------------------------------------------------------- 190void ofApp::windowResized(int w, int h) { 191} 192//-------------------------------------------------------------- 193void ofApp::gotMessage(ofMessage msg) { 194} 195//-------------------------------------------------------------- 196void ofApp::dragEvent(ofDragInfo dragInfo) { 197}
配列の数などはあってると思うのですが、なぜかエラーが出ます。
どうすればいいでしょうか?
関連性があるかわかりませんが、`va_end`は呼ばなくてよいのでしょうか