3

我创建了一个基本球体,并且我有一个宽高比约为 2:1 的图像用作纹理。实际图像是客户的徽标,因此英国国旗的 PNG是一个替代品。使用基本球体演示代码并将(缩放)图像应用为纹理:

#include "colors.inc"

camera {
  sky <0,0,1>
  direction <-1,0,0>
  right <-4/3,0,0>
  location <30,10,1.5>
  look_at <0,0,0>
  angle 15
}
global_settings { ambient_light White }   

light_source {
  <10,-20,10>
  color White*2
}

background { color White }

plane { <0,0,1>, 0 pigment {White} }

sphere {
    <0, 0, 1>,
    1 texture {
        pigment {
        image_map { png "flag.png" map_type 1 }
        scale <0.1, 0.1, 0.1>
        }
    }
}

产生一个图像扭曲的球体,在我看来,偏离中心:

带有英国国旗的球体作为纹理应用

我无法准确描述我的预期,但我想我预计圣乔治十字的中心是球体正面的死点,直接面向相机。

4

1 回答 1

2

首先,将球体移回原点,以便可以安全地旋转。其次,使用VAngleD()函数 frommath.inc计算相机位置与应用图案方向之间的角度。最后,将球体旋转该角度并将其平移回原始位置。现在,无论后者在 XY 平面内的位置如何,图案的中心点将始终面向相机。您也可以添加类似的计算来减轻相机沿 Z 轴的平移。

#include "colors.inc"
#include "math.inc"

#declare SPHERE_LOCATION = <0, 0, 1>;
#declare CAMERA_POSITION = <30, 10, 1.5>;
#declare PATTERN_DIRECTION = x;

camera {
  sky <0,0,1>
  direction <-1,0,0>
  right <-4/3,0,0>
  location CAMERA_POSITION
  look_at SPHERE_LOCATION
  angle 15
}
global_settings { ambient_light White }   

light_source {
  <10,-20,10>
  color White*2
}

background { color White }

plane { <0,0,1>, 0 pigment {White} }

sphere {
    0,
    1 texture {
        pigment {
            image_map { png "flag.png" map_type 1}
        }
    }
    rotate z * (180 + VAngleD(CAMERA_POSITION, PATTERN_DIRECTION))
    translate SPHERE_LOCATION
}
于 2021-04-08T12:49:01.057 回答