3

我正在尝试向球体添加一些文本 - 图形节点上的标签。

例如,在下图中,我希望标记每个节点。

#include "colors.inc"

global_settings {
    assumed_gamma 1.0
    ambient_light Gray
}
light_source { <100,00,-150> color White }
camera {
  sky <0, 0, -1>
  look_at <0, 0, 0>
  location <20, -80, -160> 
}
plane { <0,0,-1>, 0
  pigment { color White }
}

 sphere {
< -50,-33,-50 > , 8
texture { pigment { color rgb 0.7 }}
}      
 sphere {
< 50,-50,-50 > , 8
texture { pigment { color rgb<1.0, 0.0, 0.0> }}
}     
cylinder {
< -50,-33,-50 >, < 50,-50,-50 > ,1
texture { pigment { color rgb 0.5 }}
}

我通常可以在绘图中添加文本,但它不在球体表面上

text{ttf "crystal.ttf", "word", 0, 0 
             pigment {Black} 
             scale 10   
             translate < -50,-33,-50 > 
    }

从浏览网页,我认为可以将文本作为纹理添加到球体,但我没有成功 - 没有文本出现。

#macro my_node(Text) 

  #declare word=texture{
                  pigment{object{ 
                             text{ttf "crystal.ttf", Text, 0, 0  pigment {Black} scale 25} 
                             colour Clear }
                          }
                       }
sphere  {< 0, 0, 0>, 8
                texture { pigment { color rgb 0.7 }}
                texture{word}
            }
#end            

object {my_node("word")
            translate < -50,-33,-50 >
         }

My question: 请问如何在球体上添加标签。谢谢

4

1 回答 1

3

所以,我做了一些测试,确实,“物体”颜料图案对你有用。正如我在评论中所写的那样,似乎是你在一个地方绘制你的“Word”颜料对象,而球体位于其他地方,因此没有交叉点,球体只绘制在“外部” “ 颜色。

我制作了这个示例文件 - 请注意我仔细指定了我的纹理对象和我的球体在原点(大致在 <-1, -1, -1> <1, 1 , 1> two-unity-cube 内) . 文本对象具有平移和缩放语句,因此它以 <0,0,0> 为中心 - 据我所知,POVRay 没有“文本测量”功能,因此您必须通过“感觉”和“眼睛”将文本居中" - 你得到的唯一测量值是字符高度最大为 1 个单位。如果您使用等宽字体,您可以了解每个字符的确切宽度 - 可能会使事情变得更容易。

然后,在创建球体并将文本应用为纹理时,我在 Z 轴上将其放大,以确保字母确实穿过球体表面 - 否则文本将位于球体“内部”。

正如我在评论中提到的,这会在弯曲的球体上创建“平面”文本,并且没有简单的方法来扭曲球体之后的文本。

所以,这对我有用。(请注意,它要求“drodisans.ttf”文件位于同一文件夹中)

#version 3.7
#include "colors.inc"


camera {
    location <0, 0, -8>
    look_at 0
}

#declare Label1 = object {
    text {
        ttf "droidsans.ttf", "Hello POV-Ray", 1, 0
        pigment {color Blue}
    }
    scale <0.3, 1, 1>
    translate <-1, -.35, -.5>
}

sphere {
    0, 1
    texture {
        pigment {object  {Label1 color Blue color Red} }
        finish {
            phong 1
            ambient 0.2
        }
        scale <.7, .5, 10>
    }
    translate <0, -.5, 0>
}


light_source {
    <0, 2, -4>
    color White   
}

现在,另一种方法可以让您更好地控制文本,甚至允许文本实际“环绕”球体,即使用来自单独文件的图像作为 image_map。这将需要您使用另一个程序将标签预渲染为图像(它甚至可以是 POVRay 本身,或者您可以使用 Ghostscript 从 postscript 片段中做到这一点)。“ image_map”指令将图像文件视为投影在 <0, 0, 0> 到 <1, 1, 0> 正方形上的 Unity 正方形,在 z 轴上无限延伸。但也许,由于此处需要两步渲染过程,您应该坚持使用另一种方法,除非您在定位文本时遇到问题。(正如我所解释的,必须“手动”进行居中)。

请注意,任何一种方法都需要您在原点“组装您的对象”,然后进行平移和缩放。

由上述脚本渲染的 eImage

于 2017-10-24T12:58:15.327 回答