Math 在octave/matlab中设置三维绘图的默认视图

Math 在octave/matlab中设置三维绘图的默认视图,math,animation,plot,rotation,octave,Math,Animation,Plot,Rotation,Octave,我试图用gnu八度音阶制作一个基本动画,向某人演示旋转矩阵的功能 其想法是创建一组点的三维散点图,这些点表示围绕一个假想球体(如板球上的接缝)的一个大圆,然后通过旋转矩阵进行变换并重新填充,从而产生“球”在空间中旋转的错觉 我的数学和代码都能很好地创建动画(如果代码有点不规范,但本练习的目的只是向朋友展示一个概念),但我的问题是每次调用clf,它都会重置绘图视图的比例和方向,所以我最后得到的是一个二维椭圆,它的大小也在不断变化 代码如下: # magic numbers NUM_POINTS =

我试图用gnu八度音阶制作一个基本动画,向某人演示旋转矩阵的功能

其想法是创建一组点的三维散点图,这些点表示围绕一个假想球体(如板球上的接缝)的一个大圆,然后通过旋转矩阵进行变换并重新填充,从而产生“球”在空间中旋转的错觉

我的数学和代码都能很好地创建动画(如果代码有点不规范,但本练习的目的只是向朋友展示一个概念),但我的问题是每次调用
clf
,它都会重置绘图视图的比例和方向,所以我最后得到的是一个二维椭圆,它的大小也在不断变化

代码如下:

# magic numbers
NUM_POINTS = 50;
NUM_FRAMES = 20;

# generate initial circle
r = 10;
t = linspace(0, 2*pi, NUM_POINTS)';
circsx = r.*cos(t);
circsy = r.*sin(t);
circsz = zeros(NUM_POINTS, 1); # z axis initially all zero

# create array of 3D vectors for point coordinates
vectors = cell(10, 1);
for i = 1:NUM_POINTS
vectors{i, 1} = [circsx(i); circsy(i); circsz(i)];
end

# animation frame loop
for i = 1:NUM_FRAMES
clf
hold

# circle plot loop
for j = 1:NUM_POINTS

# arbitrary rotation values per frame
thetaX = 1*i;
thetaY = 3*i;
thetaZ = -2*i;

rotX = [1, 0, 0; 
        0, cosd(thetaX), -sind(thetaX); 
        0, sind(thetaX), cosd(thetaX)];

rotY = [cosd(thetaY), 0, sind(thetaY); 
        0, 1, 0; 
        -sind(thetaY), 0, cosd(thetaY)];

rotZ = [cosd(thetaZ), -sind(thetaZ), 0; 
        sind(thetaZ), cosd(thetaZ), 0; 
        0, 0, 1];

vectors{j, 1} = rotX * vectors{j, 1};
vectors{j, 1} = rotY * vectors{j, 1};
vectors{j, 1} = rotZ * vectors{j, 1};

scatter3(vectors{j,1}(1,1), vectors{j,1}(2,1), vectors{j,1}(3,1))
end

hold off
pause (.0001)
end

有没有办法设置绘图的初始方向?或者每次打印时停止绘图仪重新计算比例和方向?它甚至不需要能够旋转,我只需要一个简单的固定等距视图,每个轴上有10个单位的固定比例就可以了。

现在就可以了。您可以查看
视图
函数(我假设它们的倍频程相同)。部分问题在于您使用的动画方法效率低下。您正在完全删除图形,并在每次迭代时调用高级函数
scatter3
。您应该调用
scatter3
一次,然后按照我在中的演示更改数据值(我还使用
axis
保持视图固定)。另外,这里似乎没有必要使用单元格数组——它们只是让事情变得更棘手。@horchler——为什么不回答这个问题呢?谢谢你的建议,view和axis完全符合我的要求,但是我在解决如何更改scatter3图中的数据值时遇到了一些麻烦,你有没有可能详细说明一下?我看了你在回答另一个人的问题时给出的演示,但是我不太清楚如何将该解决方案推断到我的问题中。事实上,我认为我的问题源于这样一个事实,即drawnow在我调用它时没有更新情节。我可以设置“扩展数据”、“ydata”和“zdata”;我可以通过调用这些值上的get来验证新数据是否已更新,但由于某些原因,绘图未更新。。然而,我做了一些研究,看起来这是八度音阶的问题,而不是我的代码,所以至少我知道它可能不是我。能够让它运行得更快会很好,但事实上,这只是一个简单的概念演示,所以就其目的而言,这是很好的。非常感谢你的帮助。