|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
I'm trying to create a random uniformly distributed vector through a
hemisphere positioned at the intersection point between ray and an
object. I can already create a random vector but how do I quickly/easily
rotate it based on the desired hemisphere orientation?
I use left-handed coordinatesystem: x is right, y is up, and z is forward.
Let's have a vector V which is random vector inside a hemisphere which
has a pole at 0,1,0 (just like the northern hemisphere of Earth). I want
to orient the vector inside a hemishere which has a pole pointing at
vector N. How do I do this? I'd prefer something that can be done
without expensive trigonometric functions - if possible.
PS. If this is the wrong forum, please advice.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Severi Salminen wrote:
> Let's have a vector V which is random vector inside a hemisphere which
> has a pole at 0,1,0 (just like the northern hemisphere of Earth). I want
> to orient the vector inside a hemishere which has a pole pointing at
> vector N. How do I do this?
Example:
V = (0.71, 0.71, 0) //The random vector in "northern hemishpere")
N = (-1,0,0) //The pole I want to orientate the random vectors to)
The result is
Vnew = (-0.71, 0.71, 0)
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Severi Salminen wrote:
> Severi Salminen wrote:
>
>> Let's have a vector V which is random vector inside a hemisphere which
>> has a pole at 0,1,0 (just like the northern hemisphere of Earth). I want
>> to orient the vector inside a hemishere which has a pole pointing at
>> vector N. How do I do this?
>
> Example:
>
> V = (0.71, 0.71, 0) //The random vector in "northern hemishpere")
> N = (-1,0,0) //The pole I want to orientate the random vectors to)
>
> The result is
>
> Vnew = (-0.71, 0.71, 0)
Some relevant macros in transforms.inc:
vtransform(vec, trans)
Reorient_Trans(Axis1, Axis2)
Point_At_Trans(YAxis)
I don't have time to test this, but I think this will work:
#include "transforms.inc"
#declare P = <0, 1, 1>;
#declare N = <-1, 0, 0>;
#declare V = <0.71, 0.71, 0>;
#declare Vnew = vtransform(V, Reorient_Trans(P, N));
This should also work:
#include "transforms.inc"
#declare N = <-1, 0, 0>;
#declare V = <0.71, 0.71, 0>;
#declare Vnew = vtransform(V, Point_At_Trans(N));
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
From: John VanSickle
Subject: Re: Vector calculation/rotation problem
Date: 16 Feb 2008 19:11:07
Message: <47b77b9b@news.povray.org>
|
|
|
| |
| |
|
|
Severi Salminen wrote:
> I'm trying to create a random uniformly distributed vector through a
> hemisphere positioned at the intersection point between ray and an
> object. I can already create a random vector but how do I quickly/easily
> rotate it based on the desired hemisphere orientation?
>
> I use left-handed coordinatesystem: x is right, y is up, and z is forward.
>
> Let's have a vector V which is random vector inside a hemisphere which
> has a pole at 0,1,0 (just like the northern hemisphere of Earth). I want
> to orient the vector inside a hemishere which has a pole pointing at
> vector N. How do I do this? I'd prefer something that can be done
> without expensive trigonometric functions - if possible.
#local vX=vnormalize(vcross(vN,<vN.y,vN.z,-vN.x>));
#local vY=vnormalize(vcross(vX,vN));
#local sN=rand(YourRandomSeed);
#local sL=sqrt(1-sN*sN);
#local Angle=rand(YourRandomSeed)*360;
#local vResult=sN*vN
+ vrotate(x,y*Angle).x * vX * sL
+ vrotate(x,y*Angle).z * vY * sL ;
vResult is a vector in the hemisphere that faces in the direction of vN.
Regards,
John
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Tor Olav Kristensen wrote:
> Severi Salminen wrote:
>> Severi Salminen wrote:
>>
>>> Let's have a vector V which is random vector inside a hemisphere which
>>> has a pole at 0,1,0 (just like the northern hemisphere of Earth). I want
>>> to orient the vector inside a hemishere which has a pole pointing at
>>> vector N. How do I do this?
>>
>> Example:
>>
>> V = (0.71, 0.71, 0) //The random vector in "northern hemishpere")
>> N = (-1,0,0) //The pole I want to orientate the random vectors to)
>>
>> The result is
>>
>> Vnew = (-0.71, 0.71, 0)
...
> I don't have time to test this, but I think this will work:
>
> #include "transforms.inc"
> #declare P = <0, 1, 1>;
> #declare N = <-1, 0, 0>;
> #declare V = <0.71, 0.71, 0>;
> #declare Vnew = vtransform(V, Reorient_Trans(P, N));
...
Hmmm... I wonder where I got the <0, 1, 1> vector from.
This is what I should have written:
#include "transforms.inc"
#declare P = <0, 1, 0>;
#declare N = <-1, 0, 0>;
#declare V = <0.71, 0.71, 0>;
#declare Vnew = vtransform(V, Reorient_Trans(P, N));
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
From: Severi Salminen
Subject: Re: Vector calculation/rotation problem
Date: 17 Feb 2008 06:09:45
Message: <47b815f9@news.povray.org>
|
|
|
| |
| |
|
|
Thanks, but I'm actually interested in general solution without
resorting to functions provided by PovRay. As it is probably OT here,
I'll post the question to OT.
Post a reply to this message
|
|
| |
| |
|
|
From: Tor Olav Kristensen
Subject: Re: Vector calculation/rotation problem
Date: 17 Feb 2008 19:53:12
Message: <47b8d6f8@news.povray.org>
|
|
|
| |
| |
|
|
Severi Salminen wrote:
> Thanks, but I'm actually interested in general solution without
> resorting to functions provided by PovRay. As it is probably OT here,
> I'll post the question to OT.
The code below is based on John's solution (but with some
simplifications). Most of the functions special to POV-Ray
has been replaced by common functions.
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#version 3.6;
#declare vN = <2, 1, 3>;
#declare SS = seed(6457);
#declare Cnt = 20;
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#declare vY =
vN/sqrt(vN.x*vN.x + vN.y*vN.y + vN.z*vN.z);
#declare vX =
<vY.z, 0, -vY.x>/sqrt(vY.x*vY.x + vY.z*vY.z);
#declare vZ =
<vX.y*vY.z - vX.z*vY.y, vX.z*vY.x - vX.x*vY.z, vX.x*vY.y - vX.y*vY.x>;
cylinder { 0*y, vX, 0.03 pigment { color rgb <2, 1, 1> } }
cylinder { 0*y, vY, 0.03 pigment { color rgb <1, 2, 1> } }
cylinder { 0*y, vZ, 0.03 pigment { color rgb <1, 1, 2> } }
#declare I = 0;
#while (I < Cnt)
#declare sN = rand(SS);
#declare sL = sqrt(1 - sN*sN);
#declare Angle = -2*pi*rand(SS);
#declare vResult = sN*vY + sL*(cos(Angle)*vX + sin(Angle)*vZ);
cylinder { 0*y, vResult, 0.01 pigment { color rgb <1, 1, 1> } }
#declare I = I + 1;
#end // while
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
background { color rgb <0.0, 0.0, 0.5> }
light_source { <1, 1, 1>*100 color rgb <1, 1, 1> }
camera {
location <3, 1, 2>
look_at <0, 0, 0>
}
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|