2017-04-13 2 views
2

私は3D点群をプロットしていますが、図をある姿勢に回転させるのは難しいです。例えば図形の視点をベクトルに沿って3dの位置に移動するにはどうすればいいですか?

figure; hold on; 

z = linspace(0,3*pi,250); 
x = 2*cos(z) + rand(1,250); 
y = 2*sin(z) + rand(1,250); 

plot3(x, y, z, 'b.', 'MarkerSize', 20); 

plot3(x(1), y(1), z(1), 'kx', 'MarkerSize', 20); 
plot3([x(1) x(end)], [y(1) y(end)], [z(1) z(end)], '-k'); 

デフォルトの視点は、私が 'X' の位置から黒い線に沿って見てみたい

Figure showing point cloud

です。私は手動でGUIコントロールを持つ図形を回転させることができる、と私は方位角96高さに最も近い得ることが判明-46

Rotated Figure

Iは

view(96, -46); 

を使用して、この位置にビューを回転させることができるが視点は実際には「X」の上には配置されません。 「X」は、視点の前のある距離です。さらに、私はこのコードを呼び出すたびに異なるベクトルを持っているので、毎回同じ方位角と仰角を使うことはできません。

ベクトルから方位角と仰角を計算できるはずです。私の試み、

x_dif = x(end)- x(1); 
y_dif = y(end)-y(1); 
z_dif = z(end)-z(1); 

azimuth = (atan(x_dif/y_dif))*180/pi; 
elevation = (atan(z_dif/sqrt(x_dif^2+y_dif^2)))*180/pi; 
view(azimuth, elevation); 

これは、不正な解決策を生成します。方位角と仰角がプロットボックスの中心に対して相対的でなければならないと考えられます。 (view documentation)。私はこれを行う方法がわかりません。

どのようにベクトルを与えられた図に回転を計算して適用できますか?

答えて

3

viewには、[alt,azi]ではなく、鮮やかな方向[x,y,z]を使用するオプションがあります。

この

は私の作品:

enter image description here

あなたは次のような結果が表示されるはずです

function cecilia() 
    figure; hold on; 

    z = linspace(0,3*pi,250); 
    x = 2*cos(z) + rand(1,250); 
    y = 2*sin(z) + rand(1,250); 

    plot3(x, y, z, 'b.', 'MarkerSize', 20); 

    plot3(x(1), y(1), z(1), 'kx', 'MarkerSize', 20); 
    plot3([x(1) x(end)], [y(1) y(end)], [z(1) z(end)], '-k'); 

    x_dif = x(end)- x(1); 
    y_dif = y(end)-y(1); 
    z_dif = z(end)-z(1); 

    view([x_dif,y_dif,z_dif]); 
    axis equal 
end 

(デフォルトplot軸のスケーリングの変形を避けるためにaxis equal呼び出しに注意してください)楽しい!

+0

私はドキュメントでこれを見落としました。良い発見! – Cecilia

+0

ドキュメントには心配はありません。私は 'atan()* 180/pi()'ではなく 'atand()'を使うべきですが、あなたの '[alt、az]'コードも 'axis equal'で動作していると思います。 –

関連する問題