当前位置: 首页 > 知识库问答 >
问题:

由6个贴片重建一个球体

司寇山
2023-03-14

听起来对我来说很容易,直到我试过

这个实现使用了lib igl,但问题不在于我缺乏数学知识:-\

Eigen::MatrixXd p;
const int size = 128;
p.resize(size * size, 3);
int index = 0;

for (int y = 0; y < size; y++)
{
  double ypos = (double(y) / double(size - 1)) - 0.5;
  for (int x = 0; x < size; x++)
  {
    double xpos = (double(x) / double(size - 1)) - 0.5;

    const double sphericalTheta = xpos * (pi / 2.0);
    const double sphericalPhi = ypos * (pi / 2.0);

    const double mX = cos(sphericalPhi) * sin(sphericalTheta);
    const double mY = cos(sphericalPhi) * cos(sphericalTheta);
    const double mZ = sin(sphericalPhi);
    p(index, 0) = mX;
    p(index, 1) = mY;
    p(index, 2) = mZ;
    index++;
  }
}

Eigen::MatrixXi f;
igl::write_triangle_mesh(path, p, f);

共有1个答案

李成礼
2023-03-14

所以简单地把一个立方体投影到球体上...

>

  • 将多维数据集创建为nxn范围内点的网格<-1,+1>

    所以简单地说,立方体的每个面都是nxn点的规则网格。每一张脸都有自己的颜色。每个点都有它的位置和法线。

    //---------------------------------------------------------------------------
    List<double> pnt;       // (x,y,z) all points
    List<double> nor;       // (x,y,z) per point
    List<int   > fac;       // (ix,p0,p1,p2) per triangle
    List<double> col;       // (r,g,b) per ix
    
    void sphere_init()
        {
        int i,j,n=10,n3=3*n,i0,i1,ix;
        double x,y,z,d=2.0/double(n-1);
    
        // clear mesh
        pnt.num=0;
        nor.num=0;
        fac.num=0;
        col.num=0;
    
        #define face0                \
            for (j=0;j<n-1;j++)      \
             for (i=0;i<n-1;i++)     \
                {                    \
                i1=i0+(3*(i+(j*n))); \
                fac.add(ix);         \
                fac.add(i1+n3+0);    \
                fac.add(i1   +3);    \
                fac.add(i1   +0);    \
                fac.add(ix);         \
                fac.add(i1+n3+0);    \
                fac.add(i1+n3+3);    \
                fac.add(i1   +3);    \
                }
    
        #define face1                \
            for (j=0;j<n-1;j++)      \
             for (i=0;i<n-1;i++)     \
                {                    \
                i1=i0+(3*(i+(j*n))); \
                fac.add(ix);         \
                fac.add(i1+n3+0);    \
                fac.add(i1   +0);    \
                fac.add(i1   +3);    \
                fac.add(ix);         \
                fac.add(i1+n3+3);    \
                fac.add(i1+n3+0);    \
                fac.add(i1   +3);    \
                }
    
        // init cube faces as 6 x N x N grid of points
        ix=0; z=-1.0; i0=pnt.num;
        col.add(0.0); 
        col.add(0.0); 
        col.add(1.0);
        for (y=-1.0,j=0;j<n;j++,y+=d)
         for (x=-1.0,i=0;i<n;i++,x+=d)
            {
            pnt.add(x); nor.add( 0.0);
            pnt.add(y); nor.add( 0.0);
            pnt.add(z); nor.add(-1.0);
            }
        face0;
    
        ix+=3; z=+1.0; i0=pnt.num;
        col.add(0.2); 
        col.add(0.2); 
        col.add(1.0);
        for (y=-1.0,j=0;j<n;j++,y+=d)
         for (x=-1.0,i=0;i<n;i++,x+=d)
            {
            pnt.add(x); nor.add( 0.0);
            pnt.add(y); nor.add( 0.0);
            pnt.add(z); nor.add(+1.0);
            }
        face1;
    
        ix+=3; x=-1.0; i0=pnt.num;
        col.add(1.0);
        col.add(0.0);
        col.add(0.0);
        for (y=-1.0,j=0;j<n;j++,y+=d)
         for (z=-1.0,i=0;i<n;i++,z+=d)
            {
            pnt.add(x); nor.add(-1.0);
            pnt.add(y); nor.add( 0.0);
            pnt.add(z); nor.add( 0.0);
            }
        face1;
    
        ix+=3; x=+1.0; i0=pnt.num;
        col.add(1.0); 
        col.add(0.2); 
        col.add(0.2);
        for (y=-1.0,j=0;j<n;j++,y+=d)
         for (z=-1.0,i=0;i<n;i++,z+=d)
            {
            pnt.add(x); nor.add(+1.0);
            pnt.add(y); nor.add( 0.0);
            pnt.add(z); nor.add( 0.0);
            }
        face0;
    
        ix+=3; y=-1.0; i0=pnt.num;
        col.add(0.0); 
        col.add(1.0); 
        col.add(0.0);
        for (x=-1.0,j=0;j<n;j++,x+=d)
         for (z=-1.0,i=0;i<n;i++,z+=d)
            {
            pnt.add(x); nor.add( 0.0);
            pnt.add(y); nor.add(-1.0);
            pnt.add(z); nor.add( 0.0);
            }
        face0;
    
        ix+=3; y=+1.0; i0=pnt.num;
        col.add(0.2); 
        col.add(1.0); 
        col.add(0.2);
        for (x=-1.0,j=0;j<n;j++,x+=d)
         for (z=-1.0,i=0;i<n;i++,z+=d)
            {
            pnt.add(x); nor.add( 0.0);
            pnt.add(y); nor.add(+1.0);
            pnt.add(z); nor.add( 0.0);
            }
        face1;
    
        // project to sphere
        for (i=0;i<pnt.num;i+=3)
            {
            x=pnt.dat[i+0];
            y=pnt.dat[i+1];
            z=pnt.dat[i+2];
            d=sqrt((x*x)+(y*y)+(z*z));
            if (d>1e-10) d=1.0/d;
            x*=d; nor.dat[i+0]=x; pnt.dat[i+0]=x;
            y*=d; nor.dat[i+1]=y; pnt.dat[i+1]=y;
            z*=d; nor.dat[i+2]=z; pnt.dat[i+2]=z;
            }
        #undef face0
        #undef face1
        }
    void sphere_draw()
        {
        glEnable(GL_CULL_FACE);
        glFrontFace(GL_CCW);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_COLOR_MATERIAL);
        int i,ix;
        glBegin(GL_TRIANGLES);
        for (i=0;i<fac.num;)
            {
            ix=fac.dat[i]; i++;
            glColor3dv(col.dat+ix);
            glNormal3dv(nor.dat+fac.dat[i]); glVertex3dv(pnt.dat+fac.dat[i]); i++;
            glNormal3dv(nor.dat+fac.dat[i]); glVertex3dv(pnt.dat+fac.dat[i]); i++;
            glNormal3dv(nor.dat+fac.dat[i]); glVertex3dv(pnt.dat+fac.dat[i]); i++;
            }
        glEnd();
        }
    

    我还使用我的动态列表模板,所以:


    列表 xxx; 双xxx[]相同;
    xxx.add(5);5添加到列表末尾
    xxx[7]访问数组元素(安全)
    xxx.dat[7]访问数组元素(不安全但快速直接访问)
    xxx.num是数组的实际使用大小
    xxx.reset()清除数组并设置xxx.num=0xxx.allocate(100)100项预分配空间

    此处预览:

  •  类似资料:
    • 本文向大家介绍使用canvas画一个小球自由落体的效果相关面试题,主要包含被问及使用canvas画一个小球自由落体的效果时的应答技巧和注意事项,需要的朋友参考一下

    • 从已经加载的纹理贴图集中创建精灵 通常Pixi给你三种方式从已经加载的纹理贴图集中创建精灵: 使用 TextureCache: let texture = TextureCache["frameId.png"], sprite = new Sprite(texture); 如果你是使用的 loader来加载纹理贴图集, 使用loader的 resources: let sprite = new S

    • 本文向大家介绍python 实现一个贴吧图片爬虫的示例,包括了python 实现一个贴吧图片爬虫的示例的使用技巧和注意事项,需要的朋友参考一下 今天没事回家写了个贴吧图片下载程序,工具用的是PyCharm,这个工具很实用,开始用的Eclipse,但是再使用类库或者其它方便并不实用,所以最后下了个专业开发python程序的工具,开发环境是Python2,因为大学时自学的是python2 第一步:就是

    • 问题 你想由数组创建一个字符串。 解决方案 使用 JavaScript 的数组方法 toString(): ["one", "two", "three"].toString() # => 'one,two,three' 讨论 toString() 是一个标准的 JavaScript 方法。不要忘记圆括号。

    • configure脚本创建一个名为'config.status'的文件,用它描述在包最后一次进行配置时 给出的配置选项。该文件是一个shell脚本文件,如果运行它,将重新创建相同的配置。 你可以用'--recheck'选项调用'config.status'以更新它自身。如果你修改了configure, 该选项是有用的,这是因为某些测试的结果可能会与上一次运行的结果不同。选项'--recheck'以