球体の表面の座標を取得したい(直交座標→極座標変換)

たとえばとある「球体の表面を這い回る」あるいは「ある点からX,Y,Z的に等距離の座標」を取得し続けたい場合……
球座標変換を行う。2角度と球体半径から直交座標を取得する。

	@Start
	// 親オブジェクトから与えられた角度(度数)をラジアン角に変換、極座標のθ・φの初期値とする.
	angleTheta	= initAngleT * Mathf.Deg2Rad;
	anglePhi	= initAngleP * Mathf.Deg2Rad;
	
	// パーティクルオブジェクトからパーティクルコンポーネントを取得する.
	partSys = tgtParticleObj.GetComponent<ParticleSystem>();
	
	// 初期θ・φからパーティクルオブジェクトの初期位置を決定する。基準は本オブジェクトの中心を使用する.
	tgtParticleObj.transform.position = pos + GetPositionOnSphere(angleTheta, anglePhi, particleSphereRadius);

	@Update
	// 中心として使用するスフィアはY軸を中心に回転し続ける.
	thisObj.transform.eulerAngles += new Vector3(0, Time.deltaTime * sphereRollingSpeed, 0);
	
	// 経過時間に従い、θ・φを変化させていく­.
	angleTheta	+= Time.deltaTime * moveSpeed1 * particleSpeed * Mathf.Deg2Rad;
	anglePhi	+= Time.deltaTime * moveSpeed2 * particleSpeed * Mathf.Deg2Rad;
	
	// 本フレームにおけるパーティクルオブジェクトの位置を決定・変更する.
	tgtParticleObj.transform.position = pos + GetPositionOnSphere(angleTheta, anglePhi, particleSphereRadius);

	// 直行座標・球体座標変換公式.
	public Vector3 GetPositionOnSphere(float angle1, float angle2, float r)
	{
	        float x = r * Mathf.Sin(angle1) * Mathf.Cos(angle2);
	        float y = r * Mathf.Sin(angle1) * Mathf.Sin(angle2);
	        float z = r * Mathf.Cos(angle1);
	        return new Vector3(x, y, z);
	}

画像だとわかりづらいが、パーティクルのエミッターを背負ったオブジェクトが球体の表面(正確には球体中心から一定の距離)を動き回っている。
f:id:DYMN:20140614232834p:plain

角度に乱数突っ込んで座標に小さいオブジェクト生成しまくるような処理試すと球が形作られていく。