球面細分方法记录

将球面进行三角细分

由于相机位置需要在球面上进行生成,因此需要对球面进行细分,并将位置进行保存。保存之后使用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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值