POV-Ray : Newsgroups : povray.advanced-users : Normal vector deformation Server Time
11 Oct 2026 13:38:24 EDT (-0400)
  Normal vector deformation (Message 1 to 19 of 19)  
From: Rune
Subject: Normal vector deformation
Date: 13 Jan 2001 17:04:27
Message: <3a60d0eb@news.povray.org>
I'm working on some deformation macros that deforms the point vectors and
the normal vectors in a mesh.

Deforming the points is easy. Deforming the normals is a bit more
complicated.
To find a deformed normal I try to find the deformed points very close to
the start point of the normal, and see how the direction changes. However, I
can't figure out quite how to do it.

Say the macro Deform(V) will return a deformed version of V.
If I have the point P I can find the deformed point dP:
#declare dP = Deform(P)

If I have the normal N, how can I find the deformed normal dN?

Rune
--
\ Include files, tutorials, 3D images, raytracing jokes,
/ The POV Desktop Theme, and The POV-Ray Logo Contest can
\ all be found at http://rsj.mobilixnet.dk (updated January 6)
/ Also visit http://www.povrayusers.org


Post a reply to this message

From: Chris Huff
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 17:36:49
Message: <chrishuff-6A6177.17382013012001@news.povray.org>
In article <3a60d0eb@news.povray.org>, "Rune" <run### [at] inamecom> 
wrote:

> Say the macro Deform(V) will return a deformed version of V.
> If I have the point P I can find the deformed point dP:
> #declare dP = Deform(P)
> 
> If I have the normal N, how can I find the deformed normal dN?

Try something like:
#declare SmallValue = 0.01;
#declare dN = vnormalize(Deform(P+V*SmallValue) - dP);

In other words, deform the point and a second point a short distance 
along the normal from it, and use the direction from dP to the new point 
as your normal. This should work in most circumstances, and you could 
decrease SmallValue for more accuracy.

-- 
Christopher James Huff
Personal: chr### [at] maccom, http://homepage.mac.com/chrishuff/
TAG: chr### [at] tagpovrayorg, http://tag.povray.org/

<><


Post a reply to this message

From: Rune
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 19:07:50
Message: <3a60edd6@news.povray.org>
"Chris Huff" wrote:
> Try something like:
> #declare SmallValue = 0.01;
> #declare dN = vnormalize(Deform(P+V*SmallValue) - dP);
>
> In other words, deform the point and a second point a short
> distance along the normal from it, and use the direction from
> dP to the new point as your normal. This should work in most
> circumstances, and you could decrease SmallValue for more
> accuracy.

Nope, I've already tried that, and it doesn't work.
Imagine a box deformed by a shearing matrix. The normals on the skewed sides
should change, but they won't using your method. I think I need several
points for reference (two points forming vectors perpendicular to the normal
vector?), but I haven't had any luck so far.

Rune
--
\ Include files, tutorials, 3D images, raytracing jokes,
/ The POV Desktop Theme, and The POV-Ray Logo Contest can
\ all be found at http://rsj.mobilixnet.dk (updated January 6)
/ Also visit http://www.povrayusers.org


Post a reply to this message

From: Chris Huff
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 21:33:46
Message: <chrishuff-DDC14F.21351713012001@news.povray.org>
In article <3a60edd6@news.povray.org>, "Rune" <run### [at] inamecom> 
wrote:

> Nope, I've already tried that, and it doesn't work. Imagine a box 
> deformed by a shearing matrix. The normals on the skewed sides should 
> change, but they won't using your method. I think I need several 
> points for reference (two points forming vectors perpendicular to the 
> normal vector?), but I haven't had any luck so far.

Right, this only approximates, and only "works" for some 
distortions...are you only using matrix transformations? Or were you 
only using shearing matrices as an example?
I'll be thinking about this problem for a while...

-- 
Christopher James Huff
Personal: chr### [at] maccom, http://homepage.mac.com/chrishuff/
TAG: chr### [at] tagpovrayorg, http://tag.povray.org/

<><


Post a reply to this message

From: Tor Olav Kristensen
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 21:58:27
Message: <3A61148C.66317755@online.no>
Rune wrote:
> 
> "Chris Huff" wrote:
> > Try something like:
> > #declare SmallValue = 0.01;
> > #declare dN = vnormalize(Deform(P+V*SmallValue) - dP);
> >
> > In other words, deform the point and a second point a short
> > distance along the normal from it, and use the direction from
> > dP to the new point as your normal. This should work in most
> > circumstances, and you could decrease SmallValue for more
> > accuracy.
> 
> Nope, I've already tried that, and it doesn't work.
> Imagine a box deformed by a shearing matrix. The normals on the skewed sides
> should change, but they won't using your method. I think I need several
> points for reference (two points forming vectors perpendicular to the normal
> vector?), but I haven't had any luck so far.

If N is the normal at the point P, then how about trying this ?

#declare dN = vnormalize(Deform(P + 0.01*vnormalize(N)) - Deform(P));


Tor Olav
-- 
mailto:tor### [at] hotmailcom
http://www.crosswinds.net/~tok/tokrays.html


Post a reply to this message

From: Tor Olav Kristensen
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 22:02:43
Message: <3A61158D.9D409B1B@online.no>
Rune wrote:
>...
> Imagine a box deformed by a shearing matrix. The normals on the skewed sides
> should change ...

Hmmm ... Are you sure about this ?

If so, then how would you define a 
normal of a surface at a given point ?


Tor Olav
-- 
mailto:tor### [at] hotmailcom
http://www.crosswinds.net/~tok/tokrays.html


Post a reply to this message

From: Chris Huff
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 22:36:43
Message: <chrishuff-F60238.22381413012001@news.povray.org>
In article <3A61148C.66317755@online.no>, Tor Olav Kristensen 
<tor### [at] onlineno> wrote:

> If N is the normal at the point P, then how about trying this ?
> 
> #declare dN = vnormalize(Deform(P + 0.01*vnormalize(N)) - Deform(P));

That is exactly the same as what I suggested (and which won't work), 
though it is slightly reworded and I assumed the normal was already 
normalized.

-- 
Christopher James Huff
Personal: chr### [at] maccom, http://homepage.mac.com/chrishuff/
TAG: chr### [at] tagpovrayorg, http://tag.povray.org/

<><


Post a reply to this message

From: Chris Huff
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 22:42:35
Message: <chrishuff-EE1B2C.22440613012001@news.povray.org>
In article <3A61158D.9D409B1B@online.no>, Tor Olav Kristensen 
<tor### [at] onlineno> wrote:

> Hmmm ... Are you sure about this ?

The normal to the -x side of a box is -x. The top of the box is then 
sheared +x so the -x and +x faces are at a 45 degree angle...but points 
still remain in the same xz plane as they were before, the -y and +y 
faces remain perpendicular to the y axis. The normal should be at a 45 
degree angle now, <-sqrt(2)/2, sqrt(2)/2, 0> to be precise, but since 
the two sample points were in the same xz plane, their position relative 
to each other is the same, and the normal is still -x.


> If so, then how would you define a 
> normal of a surface at a given point ?

The vector perpendicular to the surface at that point.

-- 
Christopher James Huff
Personal: chr### [at] maccom, http://homepage.mac.com/chrishuff/
TAG: chr### [at] tagpovrayorg, http://tag.povray.org/

<><


Post a reply to this message

From: Tor Olav Kristensen
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 23:40:11
Message: <3A612C65.7FC6012@online.no>
Chris Huff wrote:
> 
> In article <3A61158D.9D409B1B@online.no>, Tor Olav Kristensen
> <tor### [at] onlineno> wrote:
> 
> > Hmmm ... Are you sure about this ?
> 
> The normal to the -x side of a box is -x. The top of the box is then
> sheared +x so the -x and +x faces are at a 45 degree angle...but points
> still remain in the same xz plane as they were before, the -y and +y
> faces remain perpendicular to the y axis. The normal should be at a 45
> degree angle now, <-sqrt(2)/2, sqrt(2)/2, 0> to be precise, but since
> the two sample points were in the same xz plane, their position relative
> to each other is the same, and the normal is still -x.

I see.

Then would this work ?

#declare dP = Deform(P);
#declare vN = vnormalize(N);

#declare AA = 0.01;
#declare BB = 0.1;

#declare dNpx = vnormalize(Deform(P + AA*(vN + x*BB)) - dP);
#declare dNmx = vnormalize(Deform(P + AA*(vN - x*BB)) - dP);

#declare dNpy = vnormalize(Deform(P + AA*(vN + y*BB)) - dP);
#declare dNmy = vnormalize(Deform(P + AA*(vN - y*BB)) - dP);

#declare dNpz = vnormalize(Deform(P + AA*(vN + z*BB)) - dP);
#declare dNmz = vnormalize(Deform(P + AA*(vN - z*BB)) - dP);

#declare dN = vnormalize(dNpx + dNmx + dNpy + dNmy + dNpz + dNmz);


Regards,

Tor Olav
--
mailto:tor### [at] hotmailcom
http://www.crosswinds.net/~tok/tokrays.html


Post a reply to this message

From: Tor Olav Kristensen
Subject: Re: Normal vector deformation
Date: 13 Jan 2001 23:56:11
Message: <3A613022.B2D49A20@online.no>
Tor Olav Kristensen wrote:
> 
> Chris Huff wrote:
> >
> > In article <3A61158D.9D409B1B@online.no>, Tor Olav Kristensen
> > <tor### [at] onlineno> wrote:
> >
> > > Hmmm ... Are you sure about this ?
> >
> > The normal to the -x side of a box is -x. The top of the box is then
> > sheared +x so the -x and +x faces are at a 45 degree angle...but points
> > still remain in the same xz plane as they were before, the -y and +y
> > faces remain perpendicular to the y axis. The normal should be at a 45
> > degree angle now, <-sqrt(2)/2, sqrt(2)/2, 0> to be precise, but since
> > the two sample points were in the same xz plane, their position relative
> > to each other is the same, and the normal is still -x.
> 
> I see.
> 
> Then would this work ?
> 
> #declare dP = Deform(P);
> #declare vN = vnormalize(N);
> 
> #declare AA = 0.01;
> #declare BB = 0.1;
> 
> #declare dNpx = vnormalize(Deform(P + AA*(vN + x*BB)) - dP);
> #declare dNmx = vnormalize(Deform(P + AA*(vN - x*BB)) - dP);
> 
> #declare dNpy = vnormalize(Deform(P + AA*(vN + y*BB)) - dP);
> #declare dNmy = vnormalize(Deform(P + AA*(vN - y*BB)) - dP);
> 
> #declare dNpz = vnormalize(Deform(P + AA*(vN + z*BB)) - dP);
> #declare dNmz = vnormalize(Deform(P + AA*(vN - z*BB)) - dP);
> 
> #declare dN = vnormalize(dNpx + dNmx + dNpy + dNmy + dNpz + dNmz);

I see now that this will probably not work either.

I'll think of it while I sleep.  :)


Goodnight from Tor Olav
-- 
mailto:tor### [at] hotmailcom
http://www.crosswinds.net/~tok/tokrays.html


Post a reply to this message

From: Rune
Subject: Re: Normal vector deformation
Date: 14 Jan 2001 06:43:12
Message: <3a6190d0@news.povray.org>
"Chris Huff" wrote:
> are you only using matrix transformations?

No.

> Or were you only using shearing matrices as an example?

Yes.

> I'll be thinking about this problem for a while...

I've tried this:

#local SomeVector = x;
#local Small = 0.001;
#local N1 = Perpendiculize(SomeVector,N);
#local N2 = vcross(N1,N);
#local deformP = mezz_deform(P);
#local nN1 = mezz_deform(N1*Small+P)-deformP;
#local nN2 = mezz_deform(N2*Small+P)-deformP;
#local deformN = vnormalize(vcross(nN1,nN2));

It doesn't work, but I can't understand why.

( Perpendiculize(A,B) adjusts A so it is perpendicular to B. The adjusted A
is returned. )

Rune
--
\ Include files, tutorials, 3D images, raytracing jokes,
/ The POV Desktop Theme, and The POV-Ray Logo Contest can
\ all be found at http://rsj.mobilixnet.dk (updated January 6)
/ Also visit http://www.povrayusers.org


Post a reply to this message

From: Chris Huff
Subject: Re: Normal vector deformation
Date: 14 Jan 2001 09:44:52
Message: <chrishuff-7859A9.09461714012001@news.povray.org>
In article <3a6190d0@news.povray.org>, "Rune" <run### [at] inamecom> 
wrote:

> It doesn't work, but I can't understand why.
> 
> ( Perpendiculize(A,B) adjusts A so it is perpendicular to B. The 
> adjusted A is returned. )

I think you need to make two vectors perpendicular to the normal, deform 
those, and find a vector perpendicular to those. It looks like this 
might have been what you are doing...cross products give me a headache. 
Maybe something along the lines of:

#local Small = 0.001;

#macro mezz_deform_dir(P, DP, N) (mezz_deform(P + N*Small) - DP) #end

#macro DeformNormal(Point, deformedPoint, Normal)
    #local N1 = Perpendiculize(Normal, y);
    #local N2 = Perpendiculize(Normal, N1);

    #local N1 = mezz_deform_dir(Point, deformedPoint, N1);
    #local N2 = mezz_deform_dir(Point, deformedPoint, N2);

    #local deformedNormal = Perpendiculize(N1, N2);
    (deformedNormal)
#end

I don't think a third point will be necessary, because the normal 
shouldn't change if the surface moves perpendicularly to it...but I may 
be wrong, it may be something to try.

-- 
Christopher James Huff
Personal: chr### [at] maccom, http://homepage.mac.com/chrishuff/
TAG: chr### [at] tagpovrayorg, http://tag.povray.org/

<><


Post a reply to this message

From: Rune
Subject: Re: Normal vector deformation
Date: 14 Jan 2001 11:14:03
Message: <3a61d04b@news.povray.org>
"Chris Huff" wrote:
> I think you need to make two vectors perpendicular to the
> normal, deform those, and find a vector perpendicular to
> those. It looks like this might have been what you are
> doing...cross products give me a headache.

It's exactly what I did. It's not what your solution does though... :)

> I don't think a third point will be necessary

It wouldn't make sense to use a third point.

The solution I posted myself actually turned to work perfectly after all.
The strange results I was getting were caused by a bug a somewhere else in
my macro.

Thanks for the help anyway.

Rune
--
\ Include files, tutorials, 3D images, raytracing jokes,
/ The POV Desktop Theme, and The POV-Ray Logo Contest can
\ all be found at http://rsj.mobilixnet.dk (updated January 6)
/ Also visit http://www.povrayusers.org


Post a reply to this message

From: Chris Colefax
Subject: Re: Normal vector deformation
Date: 14 Jan 2001 19:23:00
Message: <3a6242e4@news.povray.org>
Rune <run### [at] inamecom> wrote:
> The solution I posted myself actually turned to work perfectly after all.
> The strange results I was getting were caused by a bug a somewhere else in
> my macro.

In effect, you're deforming the plane defined by the current normal at the
point of the current vertex.  For the most accurate results, I guess you'd
use the derivative of your deformation function - in the general case, using
small distances along the plane should be fine.

And yes, as you've found I didn't take this into account when creating the
mesh deformation macros in the Compressed Mesh Macro File.  My only defence
is laziness - and when I first created the macros I only had one mesh that
didn't use smooth triangles, so it didn't bother me much!


Post a reply to this message

From: Wlodzimierz ABX Skiba
Subject: Re: Normal vector deformation
Date: 15 Jan 2001 05:39:16
Message: <3a62d354$1@news.povray.org>
Rune wrote in message <3a60d0eb@news.povray.org>...
> I'm working on some deformation macros that deforms the point vectors and
> the normal vectors in a mesh.
>
> Deforming the points is easy. Deforming the normals is a bit more
> complicated.

yes, little more complicated ...

> To find a deformed normal I try to find the deformed points very close to
> the start point of the normal, and see how the direction changes. However, I
> can't figure out quite how to do it.

in the first version of my deform patch I had such calculation of normal - first
I had calculated n points around of deformed point on plane perpendicualr to the
base normal with distance d, and then deformed and calculated weighted normal of
achived virtual triangles

in symbolic code:

input:
  int n - n points around base/deformed point
  dbl d - distance beetwen points and base point
  vect P - base point
  vect N - normal in base point
  func deform( point ) - deformation as function

output:
  vect ND - normal after deformation
  vect D - point after deformation

code:
  dbl local a,b,c,i,j,p,l[n]
  vect A[n]

  p = N[Y]*N[Y]

  if ( p<(1.0-EPSILON) )
   {
    p=d/sqrt(1-p)
    A[0] = p * < N[Z], 0.0, N[X])
   }
  else
   {
     A[0] = < 0.0 , 0.0 , d >
   }

  for ( i = 1 ; i < n ; i = i + 1 )
   {
    A[i] = vaxis_rotate( A[0] , N , i * 2*pi/n )
   }

  D = deform( P )

  for ( i = 0 ; i < n ; i = i + 1 )
   {
    A[ i ] = deform( A[ i ] + P ) - D
    l[ i ] = vlength( A[ i ] )
   }

  DN=< 0.0, 0.0, 0.0 >

  for ( i=0 ; i < n ; i = i + 1 )
   {
    j = i+1
    j = ( j<n ) ? j : 0
    c = vlength( A[ i ] , A[ j ] )
    p = ( l[ i ] + l[ j ] + c ) / 2.0
    p = sqrt( p * ( p - l[i] ) * ( p - c ) * ( p - l[j] ) )
    DN = DN + p * vnormalize( vcross( A[ i ] , A[ j ] )
   }

  DN = vnormalize( DN )

I hope it helps

ABX


Post a reply to this message

From: Rune
Subject: Re: Normal vector deformation
Date: 15 Jan 2001 12:19:50
Message: <3a633136$1@news.povray.org>
"Chris Colefax" wrote:
> And yes, as you've found I didn't take this into account when
> creating the mesh deformation macros in the Compressed Mesh
> Macro File.  My only defence is laziness - and when I first
> created the macros I only had one mesh that didn't use smooth
> triangles, so it didn't bother me much!

:)

I intent to release my own macros sometime that can read PCM files.
They will have both advantages and disadvantages compared to your macros.

Rune
--
\ Include files, tutorials, 3D images, raytracing jokes,
/ The POV Desktop Theme, and The POV-Ray Logo Contest can
\ all be found at http://rsj.mobilixnet.dk (updated January 6)
/ Also visit http://www.povrayusers.org


Post a reply to this message

From: Warp
Subject: Re: Normal vector deformation
Date: 16 Jan 2001 11:49:44
Message: <3a647ba8@news.povray.org>
Chris Colefax <chr### [at] tagpovrayorg> wrote:
: And yes, as you've found I didn't take this into account when creating the
: mesh deformation macros in the Compressed Mesh Macro File.  My only defence
: is laziness - and when I first created the macros I only had one mesh that
: didn't use smooth triangles, so it didn't bother me much!

  A working version would apply transformations differently on vertices and
normals.
  If a PCM is optimized, some vertices and normals can be shared. This causes
a problem (and it's a headache in the mesh compressor program as well).

-- 
char*i="b[7FK@`3NB6>B:b3O6>:B:b3O6><`3:;8:6f733:>::b?7B>:>^B>C73;S1";
main(_,c,m){for(m=32;c=*i++-49;c&m?puts(""):m)for(_=(
c/4)&7;putchar(m),_--?m:(_=(1<<(c&3))-1,(m^=3)&3););}    /*- Warp -*/


Post a reply to this message

From: Rune
Subject: Re: Normal vector deformation
Date: 16 Jan 2001 15:27:47
Message: <3a64aec3@news.povray.org>
"Warp" wrote:
>   A working version would apply transformations differently
> on vertices and normals.

Yes.

>   If a PCM is optimized, some vertices and normals can be
> shared. This causes a problem

That can easily be solved, it just requires more memory in the parsing
stage...

As I said, I'm working on a PCM reading macro that handles normal
deformation correctly. See p.b.i for an example image...

Rune
--
\ Include files, tutorials, 3D images, raytracing jokes,
/ The POV Desktop Theme, and The POV-Ray Logo Contest can
\ all be found at http://rsj.mobilixnet.dk (updated January 6)
/ Also visit http://www.povrayusers.org


Post a reply to this message

From: Warp
Subject: Re: Normal vector deformation
Date: 17 Jan 2001 06:11:20
Message: <3a657dd7@news.povray.org>
Rune <run### [at] inamecom> wrote:
:>   If a PCM is optimized, some vertices and normals can be
:> shared. This causes a problem

: That can easily be solved, it just requires more memory in the parsing
: stage...

  It's, however, a rather rare case. I suppose that most people don't
optimize the PCM, and even if they do, it seldom succeeds (unless they
use a very high error tolerance).
  I'm not sure if it's worth the efforts to take that possibility into
account...

-- 
char*i="b[7FK@`3NB6>B:b3O6>:B:b3O6><`3:;8:6f733:>::b?7B>:>^B>C73;S1";
main(_,c,m){for(m=32;c=*i++-49;c&m?puts(""):m)for(_=(
c/4)&7;putchar(m),_--?m:(_=(1<<(c&3))-1,(m^=3)&3););}    /*- Warp -*/


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.