在球体表面添加文本

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

我的问题:如何在球体上添加标签。谢谢。

povray 中,可以编写一个依赖于函数的纹理,该函数由对象的内部确定,该对象可以是文本对象。我不知道具体细节(我需要从 povray 文档中查找),但除了直接使用依赖于磁盘图像输入的纹理外,我相信这是获得包含文本的纹理的唯一方法。 - cmaster - reinstate monica
@cmaster;感谢您提供的信息 - 听起来很有前途,这可能是可行的。 - user2957945
{btsdaf} - jsbueno
1个回答

3
因此,我进行了一些测试,并且确实,“object”颜料图案适合您。正如我在评论中所写的那样,似乎有问题的是您将“Word”颜料对象绘制在一个地方,而球体则位于别处,因此没有交集,球体仅以“外部”颜色绘制。
我制作了这个示例文件-请注意,我仔细指定我的纹理对象和球体都位于原点(大致在<-1,-1,-1> <1,1,1>两个单位立方体内)。文本对象具有平移和缩放语句,因此它位于<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" directive 将图像文件视为在<0, 0, 0>至<1, 1, 0>平面上投影的Unity正方形,在z轴上无限延伸。但是,也许由于需要两步渲染过程,您应该坚持使用其他方法,除非您在定位文本时遇到问题。(居中必须“手动”完成,如我所解释的。)
请注意,任何一种方法都需要您在原点处“组装对象”,然后进行平移和缩放。

eImage rendered by the script above


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接