使用 Matlab 进行 3D 绘图
3D Drawing using Matlab
我想用 MATLAB 制作一个 3D 画家。
首先,我想显示 3 个面板 - XY
、XZ
和 YZ
视图。
用户将在每个面板中绘制他想要的内容。
之后,他将单击一个按钮以组合 3 个视图并从这些面板中获取 3d 模型。他还可以自由渲染这个模型。
我该怎么做?
这些图片说明了我想要的:
2D 视图:
3D 对象 合并 3 个视图后:
我假设您只想指定 3D 线而不指定实心块(如链接示例中所示)。我看到一个小问题:指定 XY 和 XZ 投影后,曲线上的每个点都有一个 x、y 和 z 值,因此 YZ 投影已经定义。因此,仅指定 XY 和 XZ 维度就足够了。方法如下:
要从用户那里获得图形输入,您可以使用 ginput
函数,它创建一个图形并允许用户 select 点:
[x,y,btn] = ginput(k);
其中 x
和 y
是 selected 点的坐标,btn
任何点击按钮的 ASCII 码,k
是要获得的点数。您可以让用户画一些东西,然后通过按 space 栏让绘图结束:
figure; axis([0 1 0 1]); % create empty figure
button=0; k=1; % set start values
while button~=' ' % repeat until space is pressed
[x(k) y(k), button] = ginput(1); % get one point
k=k+1; % set k for next iteration
plot(x,y);axis([0 1 0 1]); % plot the curve
end
您可以重复两次以获得 XY 和 XZ 视图。假设您将坐标保存到变量中
(x1, y1) % the XY view
(x2, z2) % the XZ view
现在您可以通过创建一个 x
向量并插入所有 y
和 z
值来创建最终的 3D 曲线。为了获得漂亮的平滑曲线,我建议使用样条插值法:
x = 0:0.01:1;
y = interp1(x1,y1,x,'spline','extrap'); % Spline interpolation + extrapolation
z = interp1(x2,z2,x,'spline','extrap'); % Spline interpolation + extrapolation
现在只需使用 plot3
函数在 3D 中绘制它:
plot3(x,y,z);
您可以轻松地扩展这个最小的例子来做任何您需要的事情,这只是为了展示 MATLAB 中的基本步骤和可能性。
这可能不是一个完整的答案,但可以添加 hbaderts 答案
要在绘制时生成平滑的Spline ,而不是直线(如他所建议的那样)
figure; axis([0 1 0 1]); % create empty figure
button=0; k=1;
while button~=' ' % repeat until space is pressed
[x(k) y(k), button] = ginput(1); % get one point
plot(x(k),y(k),'r.');axis([0 1 0 1]); % plot the points
hold on
fnplt(cscvn(vertcat(x,y)),'b',2); % Generate smooth spline
hold off
k=k+1; % set k for next iteration
end
平滑前
平滑后:
我想用 MATLAB 制作一个 3D 画家。
首先,我想显示 3 个面板 - XY
、XZ
和 YZ
视图。
用户将在每个面板中绘制他想要的内容。
之后,他将单击一个按钮以组合 3 个视图并从这些面板中获取 3d 模型。他还可以自由渲染这个模型。
我该怎么做?
这些图片说明了我想要的:
2D 视图:
3D 对象 合并 3 个视图后:
我假设您只想指定 3D 线而不指定实心块(如链接示例中所示)。我看到一个小问题:指定 XY 和 XZ 投影后,曲线上的每个点都有一个 x、y 和 z 值,因此 YZ 投影已经定义。因此,仅指定 XY 和 XZ 维度就足够了。方法如下:
要从用户那里获得图形输入,您可以使用 ginput
函数,它创建一个图形并允许用户 select 点:
[x,y,btn] = ginput(k);
其中 x
和 y
是 selected 点的坐标,btn
任何点击按钮的 ASCII 码,k
是要获得的点数。您可以让用户画一些东西,然后通过按 space 栏让绘图结束:
figure; axis([0 1 0 1]); % create empty figure
button=0; k=1; % set start values
while button~=' ' % repeat until space is pressed
[x(k) y(k), button] = ginput(1); % get one point
k=k+1; % set k for next iteration
plot(x,y);axis([0 1 0 1]); % plot the curve
end
您可以重复两次以获得 XY 和 XZ 视图。假设您将坐标保存到变量中
(x1, y1) % the XY view
(x2, z2) % the XZ view
现在您可以通过创建一个 x
向量并插入所有 y
和 z
值来创建最终的 3D 曲线。为了获得漂亮的平滑曲线,我建议使用样条插值法:
x = 0:0.01:1;
y = interp1(x1,y1,x,'spline','extrap'); % Spline interpolation + extrapolation
z = interp1(x2,z2,x,'spline','extrap'); % Spline interpolation + extrapolation
现在只需使用 plot3
函数在 3D 中绘制它:
plot3(x,y,z);
您可以轻松地扩展这个最小的例子来做任何您需要的事情,这只是为了展示 MATLAB 中的基本步骤和可能性。
这可能不是一个完整的答案,但可以添加 hbaderts 答案
要在绘制时生成平滑的Spline ,而不是直线(如他所建议的那样)
figure; axis([0 1 0 1]); % create empty figure
button=0; k=1;
while button~=' ' % repeat until space is pressed
[x(k) y(k), button] = ginput(1); % get one point
plot(x(k),y(k),'r.');axis([0 1 0 1]); % plot the points
hold on
fnplt(cscvn(vertcat(x,y)),'b',2); % Generate smooth spline
hold off
k=k+1; % set k for next iteration
end
平滑前
平滑后: