最近搞了一个matlab实现三维的几何变换的程序,挺好玩的!
也确实发现一个问题,就是程序的数据结构要事先设计好,如果数据结构没有事先想好,到后面发现数据结构有问题,再改就是大改了,而刚开始的时候如何设计数据结构呢?发现面向对象的设计思想是最好的,毕竟现实中面对的就是各种各样的对象,以对象的思考方式设计数据结构才是最自然、最有效的。
通过程序的编写,对OpenGL的实现有了一点新的认识,绝对变换、相对变换等等,不错。
运行程序,开始是一个正方体绕(1,1,1)向量的旋转360°,然后是做一些简单的变换,结果如下
然后是做一个平移变换
然后是相对旋转
相对缩放
再做平移
主程序代码如下
function main
clc
clear all
close all
% 全局坐标系
fig = ConstructGlobalAxes();
% 数据
verts = [ ...
-1 -1 -1;
1 -1 -1;
1 1 -1;
-1 1 -1;
-1 -1 1;
1 -1 1 ;
1 1 1;
-1 1 1;];
faces = [ ...
2 1 4 3;
4 8 7 3;
8 4 1 5;
3 7 6 2;
5 6 7 8;
6 5 1 2;];
cdata = hsv(size(verts, 1));
% 构造对象
hobj = ConstructObj(fig, verts, faces, cdata); % 变换对象
% 平移变换
% Translation(hobj, 2, 2, 0)
% 缩放变换
% Scale(hobj, 2, 2, 1)
% 错切变换
% Shear(hobj, 'x', 'y', 0.5)
% Shear(hobj, 'x', 'z', 0.5)
% 旋转变换
% RotationAxis(hobj, 'z', 45) % 绕坐标轴旋转
% RotationOriginAxis(hobj, [1 1 1], 45)
% Points = [1 1 1; 2 2 2];
% RotationAnyAxis(hobj, Points', 45);
% 各种变换
Points = [0 0 0; 1 1 1];
for i = 1:360/6
RotationAnyAxis(hobj, Points', 6, 'r'); % 再相对旋转
drawnow
end
pause(1)
Translation(hobj, 2, 2, 0); % 先绝对平移
pause(0.5)
RotationAnyAxis(hobj, Points', 45, 'r'); % 再相对旋转
pause(0.5)
Scale(hobj, 2, 2, 1, 'r'); % 再相对缩放
pause(0.5)
Translation(hobj, 2, 2, 0, 'r'); % 最后再相对平移
end
其他程序代码比较长,400行,就不在这里显示了。