欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三维图形的平移,旋转与错切

程序员文章站 2022-03-22 14:50:56
...

1、平移变换

    三维图形的平移变换可以描述为:

三维图形的平移,旋转与错切

%% 圆的平移,x加1,y加1,z+1
clc;clear all;
figure(1);
axis equal;
sphere(50);%球由50*50个面组成
[x y z]=sphere();
hold on;
dx = 1;dy = 1;dz = 1;
%坐标加一
T = [1 0 0 0;0 1 0 0;0 0 1 0;dx dy dz 1];
Ex = x.*T(1,1)+y.*T(2,1)+z.*T(3,1)+1.*T(4,1);
Ey = x.*T(1,2)+y.*T(2,2)+z.*T(3,2)+1.*T(4,2);
Ez = x.*T(1,3)+y.*T(2,3)+z.*T(3,3)+1.*T(4,3);
% surf(E(:,1:21),E(:,22:42),E(:,43:63));
%surf(x+dx,y+dy,z+dz);
surf(Ex,Ey,Ez);

三维图形的平移,旋转与错切

2.旋转变换

三维图形的旋转变换可描述为:

三维图形的平移,旋转与错切

%% 绘制一个柱体,然后绕x轴旋转60°

clear all;clc;
[x,y,z]=cylinder(3);  %调用cylinder函数‘()’内半径为3. 运行此命令后系统自动为x,y,z填充了数据
z(2,:)=2;      %设置矩阵Z的第二行数值全为2,即设置圆柱体高度
figure;
surf(x,y,z,'FaceColor',[1,0,0]);       %使用surf功能将x,y,z的数据导入。FaceColor即设置圆柱体颜色,红色色号为[1,0,0]
daspect([1 1 1])                  %设置x,y,z坐标间距等长。
view(30,30)                     %设置图像显示角度
hold on     
theta = linspace(0,2*pi,40)       %将一个圆周分为40份
X=3*cos(theta);                    %将cos值赋予x
Y=3*sin(theta);                     %将sin赋予Y
Z=ones(size(X))+1;                 %设置Z与X长度想等
fill3(X,Y,Z,[1,0,0]);                  %使用Fill3功能函数,填充XYZ所围成的区域,这个是顶盖
fill3(X,Y,Z-2,[1,0,0]);              %底盖
hold on
T = [1 0 0 0;0 cosd(60) sind(60) 0;0 -sind(60) cosd(60) 0;0 0 0 1];
Ex = x.*T(1,1)+y.*T(2,1)+z.*T(3,1)+1.*T(4,1);%这三句是旋转的柱面的侧面
Ey = x.*T(1,2)+y.*T(2,2)+z.*T(3,2)+1.*T(4,2);
Ez = x.*T(1,3)+y.*T(2,3)+z.*T(3,3)+1.*T(4,3);
%下面是旋转圆面,只旋转的上面的圆面,下面的没有旋转
Ex1 =X.*T(1,1)+Y.*T(2,1)+Z.*T(3,1)+1.*T(4,1);
Ey1 = X.*T(1,2)+Y.*T(2,2)+Z.*T(3,2)+1.*T(4,2);
Ez1 = X.*T(1,3)+Y.*T(2,3)+Z.*T(3,3)+1.*T(4,3);
surf(Ex,Ey,Ez);
fill3(Ex1,Ey1,Ez1,[1,0,0]);

三维图形的平移,旋转与错切

3.错切变换

错切变换的常用变换矩阵为:

三维图形的平移,旋转与错切

%% 3.用sphere生成多面体,然后对其进行错切变换,不断的改变错切系数和多面体的数量
clear all;clc;
T=[1 0 0;
   1 1 0;
   0   0 1];
for num = 1:10  %多边形的数量
    for ti = 1:0.05:1.1  %错切系数
        T(2,1) = T(2,1)*ti; %改变错切系数
        [x,y,z] = sphere(num);
        fprintf("错切系数:%f\n",T(2,1));
        surf(x,y,z);
        fprintf("显示第%d边形\n",num);
        pause(0.5);
        for i=1:num+1
            for j=1:num+1
                a=x(i,j);
                b=y(i,j);
                c=z(i,j);
                m=[a b c]*T';
                x1(i,j)=m(1);
                y1(i,j)=m(2);
                z1(i,j)=m(3);
            end
        end
        fprintf("错切第%d边形\n",num);
        surf(x1,y1,z1)
        pause(0.5);
    end
    T(2,1) = 1;
end

三维图形的平移,旋转与错切

三维图形的平移,旋转与错切