Skip to content

Instantly share code, notes, and snippets.

@kezzardrix
Last active August 22, 2016 11:13
Show Gist options
  • Select an option

  • Save kezzardrix/cf686d5093d04924fdb108bdbe9e587b to your computer and use it in GitHub Desktop.

Select an option

Save kezzardrix/cf686d5093d04924fdb108bdbe9e587b to your computer and use it in GitHub Desktop.
クォータニオン使わず球面上の2点を補間したい

#クォータニオン使わず球面上の2点を補間したい

##球面の方程式

ofPoint getPositionOnSphere(float azimuth, float elevation, float rad){
	
	float a = ofDegToRad(azimuth);
	float e = ofDegToRad(elevation);

	//zの+が天
	ofPoint pos;
	pos.x = rad * sin(e) * cos(a);
	pos.y = rad * sin(e) * sin(a);
	pos.z = rad * cos(e);

	return pos;

};

##やり方 1、球面上の2点を求め、原点(0,0,0)からのベクトルとして扱う

2、2つのベクトルの角度を求める

3、2つのベクトルの法線を求めて回転軸に

4、2で求めた角度までベクトルを回転軸で回す

ofPoint mBegin;
ofPoint mEnd;
ofPoint mCurrent;

void setup(){
    mBegin = getPositionOnSphere(40, 30, 300);
	mEnd = getPositionOnSphere(-40, 70, 300);
}

void update(){

	//正規化しない者から死んでいきます
	ofPoint begin = mBegin.getNormalized();
	ofPoint end = mEnd.getNormalized();

	//2つのベクトルが成す角度
	float dot = begin.dot(end);
	float angle = ofRadToDeg(acos(dot));

	// 法線は回転軸です
	ofPoint axis = begin.getCrossed(end);

	//0.0 ~ 1.0。好きなようにせえ
    float t = (ofGetFrameNum() % 120) / 120.0;
    
    //欲しかった点
	mCurrent = mBegin;
	mCurrent.rotate( angle * t, ofPoint(0,0,0), axis);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment