3D眼图在Matlab中

时间:2015-12-28 22:29:59

标签: matlab matlab-figure

大家好,我在垫子实验室里一直在研究眼睛3D模型,我想出的是一个扁平的球体,我应该添加什么来制作逼真的眼睛模型?

    @RunWith(MockitoJUnitRunner.class)
public class ATest {        

    @Mock
    private X x;
    @Mock
    private Y y;


        @Spy
        @InjectMocks
        private B b;

        @Mock
        private C c;

        @InjectMocks
        A a; 

        @Before
        public void setUp() {
           MockitoAnnotations.initMock(this);
        }

    }

这是我尝试过的代码,但仍然没有达到我的预期

3d eye

2 个答案:

答案 0 :(得分:2)

你的问题根本没有明确定义。例如,你的输出效果不好?

  • 眼睛的形状?
  • 最终渲染(颜色,光线等......)?

我甚至没有问你对所需3D模型的定义。在可以切割横截面的完整3D模型和适合3D可视化的3D外表面之间,我猜你正在讨论后者(第一种方法的方法完全不同)。

关于最终输出渲染,我可以给出一些关于如何使用纹理映射的指示......这些项目的非常有用的功能。

使用我在谷歌上找到的第一个纹理进行简单的纹理映射可以为您提供以下结果: triple eye soft

triple eye redder

这里是代码(请注意,我的界限与您的界限略有不同,但这只是个人选择)

%% // generate unit sphere and prepare figure
[x,y,z] = sphere();
hf=figure('Color','w') ;
axis equal, grid off , axis off , hold on

%% // Define the main globe coordinate and generate surface
rMain = 5;
xm = x*rMain ;
ym = y*rMain ;
zm = z*rMain ;
mainGlobe =  surf( xm, ym, zm, 'edgecolor', 'none' ,'FaceAlpha',0.5 ) ;

%% // Define the Iris sphere and generate surface
rIris = 2.5 ;
cutoff = ceil(size(x,1)/2) ; %// calculated to get a half sphere (better result for later texture mapping)
xi = x(:,cutoff:end) * rIris ;       
yi = y(:,cutoff:end) * rIris /3 + (rMain-rIris)*1.7 ;       
zi = z(:,cutoff:end) * rIris  ;
irisGlobe = surf( xi, yi, zi , 'edgecolor', 'none'); 

请注意,对于Iris,我从一个半球开始,然后我在Y方向压缩(并转换为将其定位在主球的外表面上)。这样可以更好地渲染纹理贴图。

你有两个表面,现在应用纹理映射可以是任何非常直接的(我给出一个简单的例子)到相当乏味......取决于你想要的结果和你需要的图像与之合作。

对于第一个例子,我将使用2个图像,一个用于眼球,一个用于虹膜。图片将在帖子结尾处提供。

%% Apply texture mappings
imgIris = imread('Iris03.jpg') ;   %// read Iris texture image
imgGlobe = imread('globe02.jpg') ; %// read Globe texture image

%// (optional) mirror globe image to repeat pattern (and increase definition)
CDglobe = [imgGlobe flipdim(imgGlobe,2)] ;

%// apply mapping
set(mainGlobe,'FaceColor','Texturemap','Cdata',CDglobe,'FaceAlpha',0.5)
set(irisGlobe,'FaceColor','Texturemap','Cdata',imgIris,'edgecolor', 'none')

%// texture mapping in default direction produce blood vessel in `Z`
%// direction mainly, so to have them departing from the Iris, we just
%// rotate the main globe by 90 degree (or we could also rotate the
%// image beforehand ...)
rotate(mainGlobe,[1 0 0],-90)

使用相同的形状(曲面)但不同的纹理,您可以获得非常直观的不同结果。例如:

imgIris = imread('Iris01.jpg') ;   %// read Iris texture image
imgGlobe = imread('globe01.jpg') ; %// read Globe texture image

%// mirror globe image to repeat pattern (and increase definition)
nrep = 3 ;
CDglobe = repmat( [imgGlobe flipdim(imgGlobe,2)], [1 nrep 1]) ;

%// apply mapping
set(mainGlobe,'FaceColor','Texturemap','Cdata',CDglobe,'FaceAlpha',0.5)
set(irisGlobe,'FaceColor','Texturemap','Cdata',imgIris,'edgecolor', 'none')

将为您提供上面的第二组眼睛示例。注意我在应用它们之前如何复制纹理数据,它允许重复眼睛周围的图案而不是只有一次。您可以使用nrep重复因子来获得不同的结果。

如果你想要一个更突出的虹膜,你可以使用定义yi的线的变体(球体被压缩和偏离的位置)。例如,使用另一个纹理和这一行:

yi = y(:,cutoff:end) * rIris  + (rMain-rIris)*1.7 - 1.1 ;

由此产生的虹膜稍微突出:

enter image description here

这里给出了用于纹理的图像。互联网上有大量的图像可以提供更好的结果。无论是合成图像(纯计算机图形)还是真实的眼睛/虹膜图片,只要注意许多图像可能具有您必须尊重的版权......

答案 1 :(得分:0)

你想要这样的东西吗?

Someone's Eye

self.session.verify = False