





 
 




 
 


Hi everyone,
I have a question regarding texture_list applied to mesh of very small size.
I've noticed that in such case artifacts appear in the texture. I can avoid the
problem by scaling up the input mesh (generated by another app), and scaling it
back down in the POVRay script, but if possible I'd like to avoid that.
I guess this is a problem related to numerical accuracy, so maybe there is a
parameter somewhere that would help ?? Or, is there something else I'm not aware
of, and doing wrong ?
Please find below a small script reproducing the problem. In the rendered image,
both triangles should look the same. The left one has initial coordinates of
order 0.01, while the right one has initial coordinates of order 0.1 and is
scaled by 0.1. These doesn't look to me as unreasonably small values...
(The same artifact occurs if using mesh2)
Thanks in advance for your help.
Pascal
#version 3.7;
#declare tex0 = texture {pigment{rgb x}};
#declare tex1 = texture {pigment{rgb y}};
#declare tex2 = texture {pigment{rgb z}};
#declare meshA = mesh {
triangle{
<0.7,0.06,0.06> ,<0.66,0.06,0.1> ,<0.7,0.06,0.1>
texture_list {tex0 tex1 tex2}
}
}
#declare meshB = mesh {
triangle{
<0.07,0.006,0.006> ,<0.066,0.006,0.01> ,<0.07,0.006,0.01>
texture_list {tex0 tex1 tex2}
}
}
camera { location 0.01 look_at 0.005*x }
light_source { 1 color rgb 1 }
object {
meshA
scale 0.1
translate <0.07,0.006,0.006>*1
}
object {
meshB
translate <0.07,0.006,0.006>*1
translate x*0.01
}
Post a reply to this message
Attachments:
Download 'bugmeshtexture.png' (15 KB)
Preview of image 'bugmeshtexture.png'


 
 


From: William F Pokorny
Subject: Re: Question regarding mesh and texture_list
Date: 24 May 2021 02:45:59
Message: <60ab4ba7$1@news.povray.org>



 
 


On 5/24/21 12:25 AM, BayashiPascal wrote:
> Hi everyone,
> I have a question regarding texture_list applied to mesh of very small size.
> I've noticed that in such case artifacts appear in the texture. I can avoid the
> problem by scaling up the input mesh (generated by another app), and scaling it
> back down in the POVRay script, but if possible I'd like to avoid that.
> I guess this is a problem related to numerical accuracy, so maybe there is a
> parameter somewhere that would help ?? Or, is there something else I'm not aware
> of, and doing wrong ?
Yes, numerical accuracy it is.
In the POVRay source there is a defined EPSILON value of 1e10 which
over time tended to be used whenever someone had need of a small
'epsilon' value.
However, there isn't a one size fits all EPSILON value. It depends on
the math being done. In triangle.cpp there is a function:
SmoothTriangle::Calculate_Smooth_T(..._)
with some code which reads:
if(dm1*dm1<EPSILON)
{
if(dm2*dm2<EPSILON)
{
if(dm3*dm3 < EPSILON)
{...
Using an 'epsilon' value of gkDBL_epsilon (~4.4e16) which is generally
good for simpler double math, the textures for both your triangles
interpolate well.
The updated code looks like:
if(dm1*dm1 < gkDBL_epsilon)
{
if(dm2*dm2 < gkDBL_epsilon)
{
if(dm3*dm3 < gkDBL_epsilon)
{...
Note. There's still a numerical limit to hit if you make things small
enough. In fact, in the very corners of each triangle it's probably
still tripped sometimes for the conditionals above; We just can't see it.
Bill P.
Post a reply to this message


 
 




 
 


Thanks for your reply !
William F Pokorny <ano### [at] anonymousorg> wrote:
> On 5/24/21 12:25 AM, BayashiPascal wrote:
> > Hi everyone,
> > I have a question regarding texture_list applied to mesh of very small size.
> > I've noticed that in such case artifacts appear in the texture. I can avoid the
> > problem by scaling up the input mesh (generated by another app), and scaling it
> > back down in the POVRay script, but if possible I'd like to avoid that.
> > I guess this is a problem related to numerical accuracy, so maybe there is a
> > parameter somewhere that would help ?? Or, is there something else I'm not aware
> > of, and doing wrong ?
>
> Yes, numerical accuracy it is.
>
> In the POVRay source there is a defined EPSILON value of 1e10 which
> over time tended to be used whenever someone had need of a small
> 'epsilon' value.
>
> However, there isn't a one size fits all EPSILON value. It depends on
> the math being done. In triangle.cpp there is a function:
>
> SmoothTriangle::Calculate_Smooth_T(..._)
>
> with some code which reads:
>
> if(dm1*dm1<EPSILON)
> {
> if(dm2*dm2<EPSILON)
> {
> if(dm3*dm3 < EPSILON)
> {...
>
> Using an 'epsilon' value of gkDBL_epsilon (~4.4e16) which is generally
> good for simpler double math, the textures for both your triangles
> interpolate well.
>
> The updated code looks like:
>
> if(dm1*dm1 < gkDBL_epsilon)
> {
> if(dm2*dm2 < gkDBL_epsilon)
> {
> if(dm3*dm3 < gkDBL_epsilon)
> {...
>
> Note. There's still a numerical limit to hit if you make things small
> enough. In fact, in the very corners of each triangle it's probably
> still tripped sometimes for the conditionals above; We just can't see it.
>
> Bill P.
Post a reply to this message


 
 




 

