cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

メモ: openFrameworksで2点を指定してofCylinderPrimitiveを描画する方法

忘れそうだったのでメモ。
端点を2点指定してその間にシリンダーを描画するサンプル。
ofCylinderPrimitiveは、デフォルトで(0,1,0)の方向に長軸が表示されるので、そのベクトルを2点を結ぶベクトルに沿うように回転させるだけ。
原理は簡単。忘れそうなのは、ofVec3fで外積を求める方法。
z.cross(v)だと、外積を返した上にzも同じ値になってしまう。外積を返すだけなら、z.getCrossed(v)。
間に余計な処理を書いたせいで、無駄に時間を食ってしまった。

void ofApp::drawCylinder2Pt(ofVec3f p, ofVec3f q, float r)
{
                ofCylinderPrimitive cylinder;
		ofVec3f v = q - p;
		cylinder.setHeight(v.length());
		ofVec3f z(0.f, 1.f, 0.f);		// default cylinder direction
		ofQuaternion quat;
		quat.makeRotate(z, v);

		//float l = v.length();
		//l = (l == 0.f) ? FLT_EPSILON : l;
		//ofVec3f t = z.getCrossed(v);
		//float angle = 180.f / PI * acos(v.dot(z) / l);
		//quat.makeRotate(angle, t);

		cylinder.setRadius(r);
		cylinder.resetTransform();
		cylinder.rotate(quat);
		cylinder.setPosition((p + q)*0.5f);
		cylinder.draw();
}

今日の本文

明治時代に実在したイザベラバードという英国人女性が日本を旅行した旅行記をもとにした漫画。とても面白い。
原作の方も、バードおばさんが遠慮なく口が悪くて気分屋なのが面白い。