使用图像对球体进行纹理处理,使其面向相机

Texturing a sphere with an image so that it faces the camera

我创建了一个基本球体,并且我有一张图像,其宽高比大致为 2:1,我将其用作纹理。实际图像是客户的徽标,因此 PNG of the UK flag 是一个替身。使用基本的球体演示代码并将(缩放的)图像应用为纹理:

#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>
        }
    }
}

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

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

首先,将球体移回原点,使其安全旋转。其次,使用 math.inc 中的 VAngleD() 函数计算相机位置与应用图案的方向之间的角度。最后,将球体旋转该角度并将其平移回原始位置.现在,无论后者在 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
}