三角细分方法记录
将球面进行三角细分
由于相机位置需要在球面上进行生成,因此需要对球面进行细分,并将位置进行保存。保存之后使用lookat函数获得最终的旋转角度。对球面进行三角细分,球面被分成三角形,使用多次细分的方法实现。
使用博客园中的代码进行实现
构造20面体
function [vertexs, faces]=GetRegularIcosahedron
t = 0:2*pi/5:(2*pi-2*pi/5);
vertexs = [cos(t'),sin(t'),zeros(5,1)];
t = t'+pi/5;
a = 2*sin(pi/5);
vertexs=[vertexs;cos(t),sin(t),a*sqrt(3)*ones(5,1)/2];
h = sqrt(0.75*a^2-cos(pi/5)^2);
vertexs = [0 0 -h;vertexs;0 0 a*sqrt(3)/2+h];
vertexs = vertexs - [zeros(12,2), ones([12,1])*0.5];
for i = 1 :12
vertexs(i, :) = vertexs(i, :)/norm(vertexs(i, :), 2);
end
faces = [1 2 3
1 3 4
1 4 5
1 5 6
1 6 2
2 3 7
2 6 11
2 7 11
3 7 8
3 4 8
4 8 9
4 5 9
5 9 10
5 6 10
6 10 11
7 8 12
8 9 12
9 10 12
10 11 12
7 11 12];
change = 0;
for i =1 : 20
if(det([vertexs(faces(i, 1), :);
vertexs(faces(i, 2), :);
vertexs(faces(i, 3), :)])<0);
change = change+1;
faces(i, :) = [faces(i, 1);faces(i, 3);faces(i, 2)];
end
end
细分函数
在上述构造的20面体的基础上实现 细分
function [vertex, face] = Subdivision(vertex, face)
face_num = size(face, 1);
vertex_num = size(vertex, 1);
new_vertexs = zeros(face_num*3, 3);
new_faces = zeros(face_num*3, 3);
for i = 1 : face_num
new_vertexs(3*(i-1)+1, :)=(vertex(face(i, 1), :)+vertex(face(i, 2), :))/2;
new_vertexs(3*(i-1)+1, :)= new_vertexs(3*(i-1)+1, :)/norm(new_vertexs(3*(i-1)+1, :),2);
new_vertexs(3*(i-1)+2, :)=(vertex(face(i, 2), :)+vertex(face(i, 3), :))/2;
new_vertexs(3*(i-1)+2, :)= new_vertexs(3*(i-1)+2, :)/norm(new_vertexs(3*(i-1)+2, :),2);
new_vertexs(3*(i-1)+3, :)=(vertex(face(i, 3), :)+vertex(face(i, 1), :))/2;
new_vertexs(3*(i-1)+3, :)= new_vertexs(3*(i-1)+3, :)/norm(new_vertexs(3*(i-1)+3, :),2);
new_faces(3*(i-1)+1, :) = [face(i, 1), vertex_num+3*(i-1)+1, vertex_num+3*(i-1)+3];
new_faces(3*(i-1)+2, :) = [face(i, 2), vertex_num+3*(i-1)+2, vertex_num+3*(i-1)+1];
new_faces(3*(i-1)+3, :) = [face(i, 3), vertex_num+3*(i-1)+3, vertex_num+3*(i-1)+2];
face(i, :) = [vertex_num+3*(i-1)+1, vertex_num+3*(i-1)+2, vertex_num+3*(i-1)+3];
end
face = [face; new_faces];
vertex = [vertex; new_vertexs];
实现细分
利用生成的20面体实现细分
[vertexs, faces]=GetRegularIcosahedron();
[vertexs, faces] = Subdivision(vertexs, faces);
[vertexs, faces] = Subdivision(vertexs, faces);
[vertex, face] = Subdivision(vertexs, faces);
scatter3(vertex(:,1),vertex(:,2),vertex(:,3),'o','filled')
save poise.txt -ascii vertex;