第十一章:3D表面映射

引入到3D表面映射&快速起步

从v2.8版以来,AspJpeg可以显示一个映射到任意3D表面上的图像,比如说映射到球形表面、圆柱形表面、圆锥形表面(或部分圆锥形表面),或者其它的数学定义的表面。这个功能对创建促销产品来说特别有用,比如说咖啡杯、棒球帽、圆珠笔,等等。带着自定义的Logo或者照片,以逼真的方式包覆在它们上面。

Pic. 1: 棒球帽上的Logo
Pic. 2a: 圆珠笔上的Logo,带阴影
Pic. 2b: 绘画在咖啡杯上的图像,带阴影

通过新的Canvas.DrawImageUV方法实现这些新功能,该方法接受一个参数:另一个AspJpeg对象的实例,该实例包含了要映射到3D表面的图像。该表面方程以及以些其它的控制了映射进程的参数通过新的UV对象的属性和方法来指定,可以通过属性Canvas.UV来访问该对象。字母组合"UV"来自于参数的传统的名称(U,V),这是定义一个任意的3D表面的三种参数化方程的参数。下面会非常详细地讲解UV对象。

以上的logo包裹一顶棒球帽的球体形状的图片(Pic. 1)是用下面的代码片段创建的(Pic. 2a的脚本在第十一章第五节-阴影中提供,而Pic 2b的脚本在第十一章第六节-把它们放在一起中提供):

VB Script:

' Open canvas image
Set Jpeg = Server.CreateObject("Persits.Jpeg")
Jpeg.Open Server.MapPath(".") & "/../images/cap.jpg"
' Open image to map to 3D surface
Set Image = Server.CreateObject("Persits.Jpeg")
Image.Open Server.MapPath(".") & "/../images/ps_logo.png"

pi = 3.14159265

' Specify UV parametera
With Jpeg.Canvas.UV
   ' Parametric equations of a spheroid
   .XFunc = "cos(v) * cos(u)"
   .YFunc = "cos(v) * sin(u)"
   .ZFunc = "1.25 * sin(v)"
   .UMin = -pi / 4
   .UMax = pi / 4
   .VMin = 0.4
   .VMax = 0.8
   .UStep = 20
   .VStep = 10

   ' Fine-tuning the position over canvas
   .ShiftX = -19
   .ShiftY = -3

   ' Camera view angle
   .CameraAngle = 34

   ' Do now show portion of the surface over the cap's "horizon"
   .HideBackFace = True

   ' Camera location and rotation
   .CameraX = 2.4
   .CameraY = 0.1
   .RotateCameraAroundAxes 0, -30, -30
End With

' Draw image on the canvas
Jpeg.Canvas.DrawImageUV Image

Jpeg.Save Server.MapPath("caplogo.jpg")

C#:

<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="ASPJPEGLib" %>
<%@ Page Language="C#" Debug="true" %>
<script runat="server" LANGUAGE="C#">

void Page_Load(Object Source, EventArgs E)
{
   // Open canvas image
   IASPJpeg objJpeg = new ASPJpeg();
   objJpeg.Open( Server.MapPath(".") + "/../images/cap.jpg" );

   // Open image to map to 3D surface
   IASPJpeg objImage = new ASPJpeg();
   objImage.Open( Server.MapPath(".") + "/../images/ps_logo.png" );

   float pi = 3.14159265f;

   // Specify UV parameters
   IUV objUV = objJpeg.Canvas.UV;

   // Parametric equations of a spheroid
   objUV.XFunc = "cos(v) * cos(u)";
   objUV.YFunc = "cos(v) * sin(u)";
   objUV.ZFunc = "1.25 * sin(v)";
   objUV.UMin = -pi / 4;
   objUV.UMax = pi / 4;
   objUV.VMin = 0.4f;
   objUV.VMax = 0.8f;
   objUV.UStep = 20;
   objUV.VStep = 10;

   // Fine-tuning the position over canvas
   objUV.ShiftX = -19;
   objUV.ShiftY = -3;

   // Camera view angle
   objUV.CameraAngle = 34;

   // Do now show portion of the surface over the cap's "horizon"
   objUV.HideBackFace = true;

   // Camera location and rotation
   objUV.CameraX = 2.4f;
   objUV.CameraY = 0.1f;
   objUV.RotateCameraAroundAxes( 0, -30, -30 );

   // Draw image on the canvas
   objJpeg.Canvas.DrawImageUV( (ASPJpeg)objImage );

   objJpeg.Save( Server.MapPath("caplogo.jpg") );
}

</script>

点击以下链接以运行该代码示例:

http://localhost/aspjpeg/manual_11/11_caplogo.asp

http://localhost/aspjpeg/manual_11/11_caplogo.aspx

注意:避免歧义,在本章中的任何地方,一个图像比如说被映射到一个3D表面的自定义的logo或者照片,简单作为图像引用,与此同时,绘制它的主背景图像作为画布引用。

3D表面的参数化的外观

注意:如果你对参数化方程很熟悉,这一节可以跳过了。

要想把一个图像拉伸到3D表面,必须用数学定义表面。一个任意表面可以用三种数学方程来代表,每种方程带有两个参数,它们是x(u, v)y(u, v)z(u, v)

要想理解3D表面的参数定义,让我们先定义一个2D曲线。可以用两种方程定义一个2D曲线,每种方程带有一个参数,它们是x(u)y(u)。例如,一个简单的半径为1的圆可以用下面方式定义:

x(u) = sin(u)
y(u) = cos(u)
u ∈ [0; 2π]

如果你喜欢这篇文章,敬请给站长打赏↑

除特别注明外,本站所有文章均为本站站长原译,转载请注明出处。