Como impedir que rótulos 3D no Asymptote sejam preenchidos automaticamente com cores?

Como impedir que rótulos 3D no Asymptote sejam preenchidos automaticamente com cores?

Estou tentando incluir rótulos após vetores 3D no Assíntota, que são desenhados com cores diferentes. Quero que todas as etiquetas sejam pretas, mas mesmo declarando a cordepoiso rótulo não faz diferença. Esta é a aparência da saída:

insira a descrição da imagem aqui

Como faço para corrigir isso? Obrigado!

import math;
settings.outformat="pdf";
settings.prc=true;
settings.embed=true;
settings.render=0;
size(5cm,0);
import graph3;

triple F(pair uv) {
real r = uv.x;
real t = uv.y;
return (r*cos(t),r*sin(t), r);}
surface coneup = surface(F, (0,0), (1,2pi), Spline);
draw(coneup, surfacepen=material(paleyellow, emissivepen=0.2 paleyellow), light=Viewport);

triple F2(pair uv) {
real r = uv.x;
real t = uv.y;
return (r*cos(t),r*sin(t), -r);}
surface conedown = surface(F2, (0,0), (1,2pi), Spline);
draw(conedown, surfacepen=material(paleyellow, emissivepen=0.2 paleyellow), light=Viewport);

draw(O--X, Arrow3);
draw(O--Y, Arrow3);
draw(O--Z, Arrow3);

draw(O--Y+Z, L=Label("null", position=EndPoint), yellow, Arrow3);
draw(O--.5*X+1.5*Z, L=Label("timelike", position=EndPoint), green, Arrow3);
draw(O--1.5*X+0.5*Z, L=Label("spacelike", position=EndPoint), red, Arrow3);

Editar:Tentei colocar o rótulo em um segmento minúsculo com

draw(0.99*(Y+Z) -- Y+Z, L=Label("null", position=EndPoint));

e acabou de produzir uma caixa com etiqueta completamente preta. Então o problema não são as cores.

Responder1

Obrigado por relatar este bug. No futuro, por favor reporte bugs emhttps://github.com/vectorgraphics/asymptote/issues

Uma correção agora está incluída no git e será incluída na próxima versão 2.84.

Tenha cuidado ao usar settings.render=0; apenas suporte limitado para remoção de superfícies ocultas, iluminação e transparência está disponível com esta abordagem. Ver https://asymptote.sourceforge.io/doc/três.html

Enquanto isso, se vocêrealmentedeseja continuar usando a opção experimental settings.render=0, você pode excluir as seguintes linhas marcadas - da sua cópia de three.asy:

diff --git a/base/three.asy b/base/three.asy
index c208f59d..9dfad6ce 100644
--- a/base/three.asy
+++ b/base/three.asy
@@ -2907,11 +2907,6 @@ object embed(string prefix=outprefix(), string label=prefix,
   if((preview || (prc && settings.render == 0)) && settings.embed) {
     image=prefix;
     if(settings.inlinetex) image += "_0";
-    if(!preview && !S.pic2.empty2()) {
-      transform T=S.pic2.scaling(S.width,S.height);
-      _shipout(image,S.pic2.fit(T),newframe,nativeformat(),false,false);
-    }
-
     image += "."+nativeformat();
     if(!settings.inlinetex) file3.push(image);
     image=graphic(image,"hiresbb");

Responder2

Eu usaria o embutido unitconecom algumas transformações geométricas. Sobre a cor: basta usar blacka parte interna Labelpara colorir o barbante. Espero que o código seja simples agora.

insira a descrição da imagem aqui

// http://asymptote.ualberta.ca/
size(6cm,0);
import three;
currentprojection=orthographic(3,2,1,zoom=.9,center=true);

surface conedown=shift(0,0,-1)*unitcone;
surface coneup=scale(1,1,-1)*conedown;
material p=material(paleyellow,emissivepen=0.2 paleyellow);
draw(coneup,surfacepen=p,light=Viewport);
draw(conedown,surfacepen=p,light=Viewport);

draw(O--X, Arrow3);
draw(O--Y, Arrow3);
draw(O--Z, Arrow3);
draw(Label("null",EndPoint,align=E,black),O--Y+Z,yellow,Arrow3);
draw(Label("time-like",EndPoint,black),O--.5*X+1.5*Z,green,Arrow3);
draw(Label("space-like",EndPoint,black),O--1.5*X+0.5*Z,red,Arrow3);

informação relacionada