以下为构造好的带形变效果时的截图带部分程序代码
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1153233346.A.html
(CSDN不能直接引用图片的哦?...)
眼球是由60经线60纬线构造出坐标的.目前想实现,当鼠标动作让表面发生形变时,形变区域即时增加象素.本人想新构造一块高象素的所谓的"布",去即时覆盖掉原来旧的表面.实际上,可以说,形变的那局部区域可看成一个放大镜,当它移动到哪,哪就由原来的3600象素变为如10000象素表面.当移走,就返回到原来的3600象素.
想在此请教实现我所谓的铺布法,或者说放大镜效果的方法,思想.谢谢!
6 个解决方案
#1
不简单呀。
#2
可不可以这样:
如果是平面的,用图像处理的方法。内存中有一幅低象素图,一幅高象素图,还有一幅掩码图(即一个m×n矩阵,m、n为图片的像素的行列数,矩阵内每个元素取值为0或1)。当眼球或放大镜移动时,实时更新掩码图,使放大镜之下的位置为1,不在放大镜之下的位置为0。然后根据掩码图进行高低像素图的合并。1的位置拷贝高图像素,0的位置拷贝低图像素。最终得到一幅新图,显示之。
如果是3D的,即高低图是作为纹理贴到一个物体上的。可以把物体表面分成足够细的很多份,先统一贴上低图纹理。当有放大镜在其上移动时,检测到放大镜下面的面,让它们的纹理变成高图纹理。放大镜离开时,恢复低图纹理。
如果是平面的,用图像处理的方法。内存中有一幅低象素图,一幅高象素图,还有一幅掩码图(即一个m×n矩阵,m、n为图片的像素的行列数,矩阵内每个元素取值为0或1)。当眼球或放大镜移动时,实时更新掩码图,使放大镜之下的位置为1,不在放大镜之下的位置为0。然后根据掩码图进行高低像素图的合并。1的位置拷贝高图像素,0的位置拷贝低图像素。最终得到一幅新图,显示之。
如果是3D的,即高低图是作为纹理贴到一个物体上的。可以把物体表面分成足够细的很多份,先统一贴上低图纹理。当有放大镜在其上移动时,检测到放大镜下面的面,让它们的纹理变成高图纹理。放大镜离开时,恢复低图纹理。
#3
嗯,首先谢谢乱云的回复.你所说的方法正是我想实现的效果.
我已构造的眼球是3D的,并且已贴上了一2D图作为皮肤.截图可我在交大饮水思源BBS上的链接.
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1153233346.A.html
本来模型是当鼠标在表面上点击,以接触点为中心周围局部区域因为触碰所以发生形变效果.形变是通过改变作用点在视觉方向上的Z轴坐标位置而实现的.周围区域的点也因距离不同,坐标改变不同而实现一个形变区域.
而因为本来模型是3600象素构造,所以效果稍微粗糙.考虑过全局更换高象素重新构造,但受实时操作时间限制,并不采用.目前被要求发贴时所说的效果,仅为作用区域局部实时增加象素.
以下为我构造3600象素时的代码,并且坐标存在数组里.
/*Generate vertices*/
void vertices (void)
{
int i,k,l;
GLdouble x_temp,r_temp;
GLdouble c=pi/60;
i=1;
for (k=1;k<31;k++)
{x_temp = r*cos(k*c);
r_temp = r*sin(k*c);
for (l = 0; l < 31; l++)
{
vertex[i].x = x_temp;
vertex[i].y = r_temp*cos(l*c);
vertex[i].z = r_temp*sin(l*c);
i++;}
for (l = 1; l < 31; l++)
{
vertex[i].x = vertex[i-2*l].x;
vertex[i].y = -vertex[i-2*l].y;
vertex[i].z = vertex[i-2*l].z;
i++;}
}
for (k=1;k<31;k++)
{for (l = 0; l < 61; l++)
{
vertex[i].x = -vertex[i-122*k].x;
vertex[i].y = vertex[i-122*k].y;
vertex[i].z = vertex[i-122*k].z;
i++;}}
vertex[0].x = r;
vertex[0].y = 0.0;
vertex[0].z = 0.0;
vertex[3600].x = -r;
vertex[3600].y = 0.0;
vertex[3600].z = 0.0;
}
形变区域已被本来的低象素坐标限定好.目前该怎么能让新构造的高象素区域很好的吻合上去并继续运行后面的形变函数达到形变效果呢.高象素区域一旦取代上去,形变效果将会更加光滑流畅.
我已构造的眼球是3D的,并且已贴上了一2D图作为皮肤.截图可我在交大饮水思源BBS上的链接.
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1153233346.A.html
本来模型是当鼠标在表面上点击,以接触点为中心周围局部区域因为触碰所以发生形变效果.形变是通过改变作用点在视觉方向上的Z轴坐标位置而实现的.周围区域的点也因距离不同,坐标改变不同而实现一个形变区域.
而因为本来模型是3600象素构造,所以效果稍微粗糙.考虑过全局更换高象素重新构造,但受实时操作时间限制,并不采用.目前被要求发贴时所说的效果,仅为作用区域局部实时增加象素.
以下为我构造3600象素时的代码,并且坐标存在数组里.
/*Generate vertices*/
void vertices (void)
{
int i,k,l;
GLdouble x_temp,r_temp;
GLdouble c=pi/60;
i=1;
for (k=1;k<31;k++)
{x_temp = r*cos(k*c);
r_temp = r*sin(k*c);
for (l = 0; l < 31; l++)
{
vertex[i].x = x_temp;
vertex[i].y = r_temp*cos(l*c);
vertex[i].z = r_temp*sin(l*c);
i++;}
for (l = 1; l < 31; l++)
{
vertex[i].x = vertex[i-2*l].x;
vertex[i].y = -vertex[i-2*l].y;
vertex[i].z = vertex[i-2*l].z;
i++;}
}
for (k=1;k<31;k++)
{for (l = 0; l < 61; l++)
{
vertex[i].x = -vertex[i-122*k].x;
vertex[i].y = vertex[i-122*k].y;
vertex[i].z = vertex[i-122*k].z;
i++;}}
vertex[0].x = r;
vertex[0].y = 0.0;
vertex[0].z = 0.0;
vertex[3600].x = -r;
vertex[3600].y = 0.0;
vertex[3600].z = 0.0;
}
形变区域已被本来的低象素坐标限定好.目前该怎么能让新构造的高象素区域很好的吻合上去并继续运行后面的形变函数达到形变效果呢.高象素区域一旦取代上去,形变效果将会更加光滑流畅.
#4
因为形变区域正是期望增加象素的区域,所以我将它比喻为放大镜.乱云你提到的那个效果的确正是我想实现的.目前就是很想找到"检测到放大镜下面的面,让它们的纹理变成高图纹理。放大镜离开时,恢复低图纹理。"的方法.我已经实现找到作用点的坐标.但后面该怎么让高图纹理取代旧的呢...请指导!
#5
在考虑detail of level的方法
例如有两个解象度的图像,一个是60*60,一个是512*512,首先建立两者坐标之间的映射关系,(例如512的左上角的100个点映射到60左上角的10个点),然后计算的时候那,先计算解象度低的形变并且绘制。然后计算高解象度图像,计算高解象度的时候,用不找计算所有的点,只需要计算鼠标周围一块区域的点(因为mass spring模型可以近似地认为只有在局部产生了形变),然后绘制这个区域,这个区域会覆盖低解象度的形变效果。
不知道可行不
例如有两个解象度的图像,一个是60*60,一个是512*512,首先建立两者坐标之间的映射关系,(例如512的左上角的100个点映射到60左上角的10个点),然后计算的时候那,先计算解象度低的形变并且绘制。然后计算高解象度图像,计算高解象度的时候,用不找计算所有的点,只需要计算鼠标周围一块区域的点(因为mass spring模型可以近似地认为只有在局部产生了形变),然后绘制这个区域,这个区域会覆盖低解象度的形变效果。
不知道可行不
#6
目前该怎么能让新构造的高象素区域很好的吻合上去并继续运行后面的形变函数达到形变效果呢
-------------------------------------------------
可以做两个模型,就是说内存中有两个球。一个球贴上低图,一个球贴上高图。在做模型时就贴好,所以两球的纹理位置能很吻合。只不过显示的时候,在放大镜外使低图球的面可见,放大镜内使高图球的面可见。应该就可以了。
-------------------------------------------------
可以做两个模型,就是说内存中有两个球。一个球贴上低图,一个球贴上高图。在做模型时就贴好,所以两球的纹理位置能很吻合。只不过显示的时候,在放大镜外使低图球的面可见,放大镜内使高图球的面可见。应该就可以了。
#1
不简单呀。
#2
可不可以这样:
如果是平面的,用图像处理的方法。内存中有一幅低象素图,一幅高象素图,还有一幅掩码图(即一个m×n矩阵,m、n为图片的像素的行列数,矩阵内每个元素取值为0或1)。当眼球或放大镜移动时,实时更新掩码图,使放大镜之下的位置为1,不在放大镜之下的位置为0。然后根据掩码图进行高低像素图的合并。1的位置拷贝高图像素,0的位置拷贝低图像素。最终得到一幅新图,显示之。
如果是3D的,即高低图是作为纹理贴到一个物体上的。可以把物体表面分成足够细的很多份,先统一贴上低图纹理。当有放大镜在其上移动时,检测到放大镜下面的面,让它们的纹理变成高图纹理。放大镜离开时,恢复低图纹理。
如果是平面的,用图像处理的方法。内存中有一幅低象素图,一幅高象素图,还有一幅掩码图(即一个m×n矩阵,m、n为图片的像素的行列数,矩阵内每个元素取值为0或1)。当眼球或放大镜移动时,实时更新掩码图,使放大镜之下的位置为1,不在放大镜之下的位置为0。然后根据掩码图进行高低像素图的合并。1的位置拷贝高图像素,0的位置拷贝低图像素。最终得到一幅新图,显示之。
如果是3D的,即高低图是作为纹理贴到一个物体上的。可以把物体表面分成足够细的很多份,先统一贴上低图纹理。当有放大镜在其上移动时,检测到放大镜下面的面,让它们的纹理变成高图纹理。放大镜离开时,恢复低图纹理。
#3
嗯,首先谢谢乱云的回复.你所说的方法正是我想实现的效果.
我已构造的眼球是3D的,并且已贴上了一2D图作为皮肤.截图可我在交大饮水思源BBS上的链接.
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1153233346.A.html
本来模型是当鼠标在表面上点击,以接触点为中心周围局部区域因为触碰所以发生形变效果.形变是通过改变作用点在视觉方向上的Z轴坐标位置而实现的.周围区域的点也因距离不同,坐标改变不同而实现一个形变区域.
而因为本来模型是3600象素构造,所以效果稍微粗糙.考虑过全局更换高象素重新构造,但受实时操作时间限制,并不采用.目前被要求发贴时所说的效果,仅为作用区域局部实时增加象素.
以下为我构造3600象素时的代码,并且坐标存在数组里.
/*Generate vertices*/
void vertices (void)
{
int i,k,l;
GLdouble x_temp,r_temp;
GLdouble c=pi/60;
i=1;
for (k=1;k<31;k++)
{x_temp = r*cos(k*c);
r_temp = r*sin(k*c);
for (l = 0; l < 31; l++)
{
vertex[i].x = x_temp;
vertex[i].y = r_temp*cos(l*c);
vertex[i].z = r_temp*sin(l*c);
i++;}
for (l = 1; l < 31; l++)
{
vertex[i].x = vertex[i-2*l].x;
vertex[i].y = -vertex[i-2*l].y;
vertex[i].z = vertex[i-2*l].z;
i++;}
}
for (k=1;k<31;k++)
{for (l = 0; l < 61; l++)
{
vertex[i].x = -vertex[i-122*k].x;
vertex[i].y = vertex[i-122*k].y;
vertex[i].z = vertex[i-122*k].z;
i++;}}
vertex[0].x = r;
vertex[0].y = 0.0;
vertex[0].z = 0.0;
vertex[3600].x = -r;
vertex[3600].y = 0.0;
vertex[3600].z = 0.0;
}
形变区域已被本来的低象素坐标限定好.目前该怎么能让新构造的高象素区域很好的吻合上去并继续运行后面的形变函数达到形变效果呢.高象素区域一旦取代上去,形变效果将会更加光滑流畅.
我已构造的眼球是3D的,并且已贴上了一2D图作为皮肤.截图可我在交大饮水思源BBS上的链接.
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1153233346.A.html
本来模型是当鼠标在表面上点击,以接触点为中心周围局部区域因为触碰所以发生形变效果.形变是通过改变作用点在视觉方向上的Z轴坐标位置而实现的.周围区域的点也因距离不同,坐标改变不同而实现一个形变区域.
而因为本来模型是3600象素构造,所以效果稍微粗糙.考虑过全局更换高象素重新构造,但受实时操作时间限制,并不采用.目前被要求发贴时所说的效果,仅为作用区域局部实时增加象素.
以下为我构造3600象素时的代码,并且坐标存在数组里.
/*Generate vertices*/
void vertices (void)
{
int i,k,l;
GLdouble x_temp,r_temp;
GLdouble c=pi/60;
i=1;
for (k=1;k<31;k++)
{x_temp = r*cos(k*c);
r_temp = r*sin(k*c);
for (l = 0; l < 31; l++)
{
vertex[i].x = x_temp;
vertex[i].y = r_temp*cos(l*c);
vertex[i].z = r_temp*sin(l*c);
i++;}
for (l = 1; l < 31; l++)
{
vertex[i].x = vertex[i-2*l].x;
vertex[i].y = -vertex[i-2*l].y;
vertex[i].z = vertex[i-2*l].z;
i++;}
}
for (k=1;k<31;k++)
{for (l = 0; l < 61; l++)
{
vertex[i].x = -vertex[i-122*k].x;
vertex[i].y = vertex[i-122*k].y;
vertex[i].z = vertex[i-122*k].z;
i++;}}
vertex[0].x = r;
vertex[0].y = 0.0;
vertex[0].z = 0.0;
vertex[3600].x = -r;
vertex[3600].y = 0.0;
vertex[3600].z = 0.0;
}
形变区域已被本来的低象素坐标限定好.目前该怎么能让新构造的高象素区域很好的吻合上去并继续运行后面的形变函数达到形变效果呢.高象素区域一旦取代上去,形变效果将会更加光滑流畅.
#4
因为形变区域正是期望增加象素的区域,所以我将它比喻为放大镜.乱云你提到的那个效果的确正是我想实现的.目前就是很想找到"检测到放大镜下面的面,让它们的纹理变成高图纹理。放大镜离开时,恢复低图纹理。"的方法.我已经实现找到作用点的坐标.但后面该怎么让高图纹理取代旧的呢...请指导!
#5
在考虑detail of level的方法
例如有两个解象度的图像,一个是60*60,一个是512*512,首先建立两者坐标之间的映射关系,(例如512的左上角的100个点映射到60左上角的10个点),然后计算的时候那,先计算解象度低的形变并且绘制。然后计算高解象度图像,计算高解象度的时候,用不找计算所有的点,只需要计算鼠标周围一块区域的点(因为mass spring模型可以近似地认为只有在局部产生了形变),然后绘制这个区域,这个区域会覆盖低解象度的形变效果。
不知道可行不
例如有两个解象度的图像,一个是60*60,一个是512*512,首先建立两者坐标之间的映射关系,(例如512的左上角的100个点映射到60左上角的10个点),然后计算的时候那,先计算解象度低的形变并且绘制。然后计算高解象度图像,计算高解象度的时候,用不找计算所有的点,只需要计算鼠标周围一块区域的点(因为mass spring模型可以近似地认为只有在局部产生了形变),然后绘制这个区域,这个区域会覆盖低解象度的形变效果。
不知道可行不
#6
目前该怎么能让新构造的高象素区域很好的吻合上去并继续运行后面的形变函数达到形变效果呢
-------------------------------------------------
可以做两个模型,就是说内存中有两个球。一个球贴上低图,一个球贴上高图。在做模型时就贴好,所以两球的纹理位置能很吻合。只不过显示的时候,在放大镜外使低图球的面可见,放大镜内使高图球的面可见。应该就可以了。
-------------------------------------------------
可以做两个模型,就是说内存中有两个球。一个球贴上低图,一个球贴上高图。在做模型时就贴好,所以两球的纹理位置能很吻合。只不过显示的时候,在放大镜外使低图球的面可见,放大镜内使高图球的面可见。应该就可以了。