这是一种裸眼3D图,其实也比较老了,不过学会去看这种图也不容易。
原理是左眼和右眼分别盯住不同的地方,由于图片从左到右是重复的,当左右眼的焦点相差一个重复周期的时候,两眼看到的图象就可以重叠。但是并不是完全重叠,正是大部分是重叠,有少部分是错位的,才产生了视差,视差就会造成立体的效果。明白了原理后,做出处理的软件就比较简单了。
这个软件操作者需提供一张作为底板的图片,和一种代表深度的黑白图片。
以上图为例,底板就是蓝色的雪花,而代表深度的图片是一个由椭圆转化而来的等高线图。读入软件后就处理产生了这个效果。
既然图片做出来了,动画也是可以做出来的。我做了个伸缩的动画,不过CSDN貌似传GIF貌似没有效果,所以就算了。更好的想法是,可以跟3D动画设计的软件结合,产生裸眼3D的视频,那就一流了。我找了一些软件,貌似没找到二次开发比较好用的动画软件。呵呵。下面是主要处理过程的VB源代码。
- Sub shengcheng3d()
- Dim a,b,x,y,y0,h,red,green,blue As Integer
- Dim hh(tuqidu) As Single
- Dim i,d As Integer
- Dim color As Color
- Dim darkness As Color '定义灰度
- Dim T1,T2 As Integer '定义周期
- If Len(ComboBox1.SelectedItem) = 0 Then
- MsgBox("请选择一个底板")
- Exit Sub
- End If
- If Len(tuqipath) = 0 Then
- MsgBox("文件路径不能为空")
- Exit Sub
- End If
- T1 = diban.Width
- T2 = diban.Height
- a = tuqi.Width
- b = tuqi.Height
- jieguo = New Bitmap(a + T1,b)
- For x = 0 To T1 - 1
- For y = 0 To b - 1
- y0 = y Mod T2
- color = diban.GetPixel(x,y0)
- jieguo.SetPixel(x,color)
- Next
- Next '填充一个周期
- For i = 1 To tuqidu
- hh(i) = pingju * (T1 / (tongju - T1) - (T1 - (i - 1)) / (tongju - (T1 - (i - 1)))) '计算各个可能高度
- Next
- For x = 0 To a - 1
- For y = 0 To b - 1
- darkness = tuqi.GetPixel(x,y)
- red = darkness.R
- green = darkness.G
- blue = darkness.B
- h = hh(tuqidu) * (255 * 3 - red - green - blue) / (3 * 255) '计算高度
- If h < hh(2) / 2 Then
- d = 0
- ElseIf h >= (hh(tuqidu - 1) + hh(tuqidu)) / 2 Then
- d = tuqidu
- End If
- For i = 2 To tuqidu - 1
- If h < (hh(i) + hh(i + 1)) / 2 And h >= (hh(i - 1) + hh(i)) / 2 Then
- d = i
- Exit For
- End If
- Next '对比高度决定位移量
- color = jieguo.GetPixel(x + d,y) '获取左边一个周期颜色
- jieguo.SetPixel(x + T1,color) '填充颜色
- Next
- ProgressBar1.Value = 100 * x / (a - 1)
- Next
- SaveFileDialog1.ShowDialog()
- If Len(SaveFileDialog1.FileName) = 0 Then
- Else
- jieguo.Save(SaveFileDialog1.FileName)
- End If
- End Sub