听起来对我来说很容易,直到我试过
这个实现使用了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);
所以简单地把一个立方体投影到球体上...
>
将多维数据集创建为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.add(5);
将5
添加到列表末尾xxx[7]
访问数组元素(安全)xxx.dat[7]
访问数组元素(不安全但快速直接访问)xxx.num
是数组的实际使用大小xxx.reset()
清除数组并设置xxx.num=0
xxx.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'以