Добавить текст на поверхность сферы

Я пытаюсь добавить текст в сферу - метки на узлах графа.

Так, например, на приведенном ниже графике я бы хотел, чтобы каждый узел был помечен.

#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: Как мне добавить метки на сферу, пожалуйста. Благодарность


person user2957945    schedule 28.08.2017    source источник
comment
В povray можно написать текстуру, которая зависит от функции, которая определяется внутренней частью объекта, который может быть текстовым объектом. Я не знаю подробностей навскидку (мне пришлось бы искать их самому в документации povray), но помимо прямого использования текстуры, которая зависит от ввода изображения с диска, я считаю, что это единственный способ получить текстуру, содержащую текст.   -  person cmaster - reinstate monica    schedule 28.08.2017
comment
@мастер ; спасибо за информацию - звучит многообещающе, в том смысле, что это возможно.   -  person user2957945    schedule 28.08.2017
comment
то, что упоминается в комментарии cmaster, - это то, что вы уже пытаетесь сделать. Это не будет искривлять текст по сфере, и если вы заставите его работать, он все равно будет искажен. Но для начала попробуйте сопоставить размеры сферы и текстуры, которые у вас есть - я бы посоветовал попытаться отрендерить все в единичном размере, близком к исходному, а затем перевести. (так что отбросьте этот масштаб 25 и поместите сферу с радиусом 1. Когда вы увидите какой-то текст, начните возиться с преобразованиями)   -  person jsbueno    schedule 24.10.2017


Ответы (1)


Итак, я провел несколько тестов, и действительно, пигментный рисунок «объект» вам подойдет. Как я писал в комментарии, кажется, что не так, что вы рисуете свой пигментный объект «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). Директива "image_map" рассматривает файл изображения как файл Unity. квадрат, проецируемый на квадрат ‹0, 0, 0> до квадрата ‹1, 1, 0>, бесконечно простирающийся по оси z. Но, возможно, из-за того, что здесь требуется двухэтапный процесс рендеринга, вам следует придерживаться другого подхода, если у вас нет проблем с размещением текста там. (Центрирование должно быть сделано "вручную", как я объяснил).

Обратите внимание, что любой метод потребует от вас «собрать свои объекты» в начале координат, а затем перевести и масштабировать.

eImage, созданный скриптом выше

person jsbueno    schedule 24.10.2017