|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Ok, first off, here is what I have to work with:
VecNorm = Normal for the vector.
VecMag = Magnitude of the vector.
Rot2Face = VecNorm(0,1,0) * VecMag.
Rot2Left = VecNorm(1,0,0) * VecMag.
Wind = returns a value of how "big" a force is blowing in x,y,z.
GetRot = Current rotation of the object.
SetForce = Set XForce, YForce and ZForce effecting the object.
Now, what I need to be able to do is take the objects rotation, figure
out which way its "facing", then negate any movement that pushes it the
opposite direction. This can be simple when in a fixed orientation,
facing the same direction as the winds X, or Y. I just check if the wind
vector is negative, I.e., blowing opposite the +X direction the object
is facing, and throw out, or reverse the value, so its now blowing +X,
instead of -X. This is however completely useless if/when trying to make
it move in an unknown orientation.
Hmm. To simplify, assume that we are dealing with a wall that is the
same "rotation" as the object itself, and that the object is a hanging
cloth. I need to be able to determine when/if the wind vector is
producing a push that is "towards" the wall, then invert it when that
happens, so that the hanging blows "Away" from the wall, but the left to
right movement needs to be the same as it would have been. So, in the
simplest terms, where the facing is +X:
hanging.rot = <0,0,0>
if wind.x < 0
wind.x *= -1;
SetForce(wind);
but how the hell do you do this if its like this?
hanging.rot = <10,30,0>
if ??????
I am guessing that the VecNorm will come into play, but I have no damn
idea how. lol
Oh, and, just to make things more stupid, some bozo decided that euler
vector can't be multiplied in the system I am working with. You can
convert to a quaternion rotation, then do it, but not <1,2,3> * <3,2,1>.
:p You can however do vect1.x = vect2.x * vect3.x, multiplying each
value separately.
Note, I am not sure if I need z or not. I am not currently using it, but
I suppose there may be cases where it could effect the result.
--
void main () {
if version = "Vista" {
call slow_by_half();
call DRM_everything();
}
call functional_code();
}
else
call crash_windows();
}
<A HREF='http://www.daz3d.com/index.php?refid=16130551'>Get 3D Models,
3D Content, and 3D Software at DAZ3D!</A>
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Patrick Elliott wrote:
> Ok, first off, here is what I have to work with:
>
> VecNorm = Normal for the vector.
> VecMag = Magnitude of the vector.
> Rot2Face = VecNorm(0,1,0) * VecMag.
> Rot2Left = VecNorm(1,0,0) * VecMag.
> Wind = returns a value of how "big" a force is blowing in x,y,z.
> GetRot = Current rotation of the object.
> SetForce = Set XForce, YForce and ZForce effecting the object.
>
> Now, what I need to be able to do is take the objects rotation, figure
> out which way its "facing", then negate any movement that pushes it the
> opposite direction. This can be simple when in a fixed orientation,
> facing the same direction as the winds X, or Y. I just check if the wind
> vector is negative, I.e., blowing opposite the +X direction the object
> is facing, and throw out, or reverse the value, so its now blowing +X,
> instead of -X. This is however completely useless if/when trying to make
> it move in an unknown orientation.
Take the dot product of the pushing force vector (not normalized) and
the vector for the facing object (normalized), and check the sign. If
the sign is negative (force and facing opposed to some degree), then
multiply the dot product by the normalized value of the pushing force,
and then subtract this from the pushing force, to yield a vector that is
perpendicular to the pushing force.
Regards,
John
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
John VanSickle wrote:
> Patrick Elliott wrote:
>> Ok, first off, here is what I have to work with:
>>
>> VecNorm = Normal for the vector.
>> VecMag = Magnitude of the vector.
>> Rot2Face = VecNorm(0,1,0) * VecMag.
>> Rot2Left = VecNorm(1,0,0) * VecMag.
>> Wind = returns a value of how "big" a force is blowing in x,y,z.
>> GetRot = Current rotation of the object.
>> SetForce = Set XForce, YForce and ZForce effecting the object.
>>
>> Now, what I need to be able to do is take the objects rotation, figure
>> out which way its "facing", then negate any movement that pushes it
>> the opposite direction. This can be simple when in a fixed
>> orientation, facing the same direction as the winds X, or Y. I just
>> check if the wind vector is negative, I.e., blowing opposite the +X
>> direction the object is facing, and throw out, or reverse the value,
>> so its now blowing +X, instead of -X. This is however completely
>> useless if/when trying to make it move in an unknown orientation.
>
> Take the dot product of the pushing force vector (not normalized) and
> the vector for the facing object (normalized), and check the sign. If
> the sign is negative (force and facing opposed to some degree), then
> multiply the dot product by the normalized value of the pushing force,
> and then subtract this from the pushing force, to yield a vector that is
> perpendicular to the pushing force.
>
> Regards,
> John
Ok, so umm, basically, like:
objnorm = VecNorm(GetRot);
windnorm = VecNorm(wind);
xdot = Wind.x * objface.x;
ydot = Wind.y * objface.y;
if xdot < 0
Wind.x -= xdot * windnorm.x;
if ydot < 0
Wind.y -= ydot * windnorm.y;
SetForce (Wind);
Now, I think this just reverses the force, right, so if I wanted to make
it got the reverse way, I would double the result of the dot product *
the force, so it move the reverse direction, not just negates it?
--
void main () {
if version = "Vista" {
call slow_by_half();
call DRM_everything();
}
call functional_code();
}
else
call crash_windows();
}
<A HREF='http://www.daz3d.com/index.php?refid=16130551'>Get 3D Models,
3D Content, and 3D Software at DAZ3D!</A>
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Patrick Elliott wrote:
> Ok, first off, here is what I have to work with:
>
> VecNorm = Normal for the vector.
> VecMag = Magnitude of the vector.
> Rot2Face = VecNorm(0,1,0) * VecMag.
> Rot2Left = VecNorm(1,0,0) * VecMag.
> Wind = returns a value of how "big" a force is blowing in x,y,z.
> GetRot = Current rotation of the object.
> SetForce = Set XForce, YForce and ZForce effecting the object.
>
> Now, what I need to be able to do is take the objects rotation, figure
> out which way its "facing", then negate any movement that pushes it the
> opposite direction. This can be simple when in a fixed orientation,
> facing the same direction as the winds X, or Y. I just check if the wind
> vector is negative, I.e., blowing opposite the +X direction the object
> is facing, and throw out, or reverse the value, so its now blowing +X,
> instead of -X. This is however completely useless if/when trying to make
> it move in an unknown orientation.
>
> Hmm. To simplify, assume that we are dealing with a wall that is the
> same "rotation" as the object itself, and that the object is a hanging
> cloth. I need to be able to determine when/if the wind vector is
> producing a push that is "towards" the wall, then invert it when that
> happens, so that the hanging blows "Away" from the wall, but the left to
> right movement needs to be the same as it would have been. So, in the
> simplest terms, where the facing is +X:
>
> hanging.rot = <0,0,0>
> if wind.x < 0
> wind.x *= -1;
> SetForce(wind);
WARNING: Untested code below.
Your code in POV-Ray SDL:
#declare vCloth = <1, 0, 0>; // Cloth normal
#declare ClothRotation = <0, 0, 0>;
#if (vWind.x < 0)
#declare vWind.x = -vWind.x;
#end // if
SetForce(vWind)
This would have been better:
#declare vCloth = <1, 0, 0>;
#declare ClothRotation = <0, 0, 0>;
#declare vCloth = vrotate(vCloth, ClothRotation);
#if (vdot(vWind, vCloth) < 0)
#declare vWind = -vWind;
#end // if
SetForce(vWind)
> but how the hell do you do this if its like this?
>
> hanging.rot = <10,30,0>
> if ??????
>
> I am guessing that the VecNorm will come into play, but I have no damn
> idea how. lol
Just put
#declare ClothRotation = <10, 30, 0>;
- into my suggestion above.
> Oh, and, just to make things more stupid, some bozo decided that euler
> vector can't be multiplied in the system I am working with. You can
> convert to a quaternion rotation, then do it, but not <1,2,3> * <3,2,1>.
> :p You can however do vect1.x = vect2.x * vect3.x, multiplying each
> value separately.
It's quite common that such vector multiplications are not defined, as
they are seldom used.
> Note, I am not sure if I need z or not. I am not currently using it, but
> I suppose there may be cases where it could effect the result.
If you do successive transformations to the cloth, then code like this
can be used:
#include "transforms.inc"
#declare vCloth = <1, 0, 0>; // Cloth normal
#declare ClothRotation = <10, 30, 0>;
#declare ClothPosition = <2, -3, 5>;
#declare ClothTransformation =
transform {
rotate ClothRotation
translate ClothPosition
}
/*
#declare MoreClothRotation = <0, 45, 0>;
#declare ClothTransformation =
transform {
ClothTransformation
rotate MoreClothRotation
}
*/
#declare vCloth = vtransform(vCloth, ClothTransformation);
#if (vdot(vWind, vCloth) < 0)
#declare vWind = -vWind;
#end // if
SetForce(vWind)
Be careful if the resulting transformation matrix of the transformation
is non-orthogonal, e.g. like it is when doing non-uniform scaling.
For such transformations, see:
"Transforming normals - CGAFaq"
http://www.cgafaq.info/wiki/Transforming_Normals
"Normal Transforms"
http://www.gignews.com/realtime020100.htm
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Tor Olav Kristensen wrote:
> Patrick Elliott wrote:
...
>> I need to be able to determine when/if the wind vector is
>> producing a push that is "towards" the wall, then invert it when that
>> happens, so that the hanging blows "Away" from the wall, but the left
>> to right movement needs to be the same as it would have been. So, in
>> the simplest terms, where the facing is +X:
...
I did not read the above thoroughly enough.
But unfortunately I do not have time right now to show you how
to do this. Maybe later.
Btw.: I did not notice that John VanSickle has already replied.
Maybe his answer helped you.
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Tor Olav Kristensen wrote:
> Tor Olav Kristensen wrote:
>> Patrick Elliott wrote:
> ...
>>> I need to be able to determine when/if the wind vector is producing a
>>> push that is "towards" the wall, then invert it when that happens, so
>>> that the hanging blows "Away" from the wall, but the left to right
>>> movement needs to be the same as it would have been. So, in the
>>> simplest terms, where the facing is +X:
> ...
>
> I did not read the above thoroughly enough.
>
> But unfortunately I do not have time right now to show you how
> to do this. Maybe later.
>
> Btw.: I did not notice that John VanSickle has already replied.
> Maybe his answer helped you.
>
Yes, you more or less confirm what he said, sort of. Though, I am still
waiting for a confirmation from him that my pseudocode is right. There
is no "vdot" function available in what I am working with, since its not
POVRay, so I have to do some calculations manually. :(
--
void main () {
if version = "Vista" {
call slow_by_half();
call DRM_everything();
}
call functional_code();
}
else
call crash_windows();
}
<A HREF='http://www.daz3d.com/index.php?refid=16130551'>Get 3D Models,
3D Content, and 3D Software at DAZ3D!</A>
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Patrick Elliott <sel### [at] npgcablecom> wrote:
> There
> is no "vdot" function available in what I am working with, since its not
> POVRay, so I have to do some calculations manually. :(
The dot product of vectors is very trivial to calculate.
http://en.wikipedia.org/wiki/Dot_product
--
- Warp
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Warp wrote:
> Patrick Elliott <sel### [at] npgcablecom> wrote:
>> There
>> is no "vdot" function available in what I am working with, since its not
>> POVRay, so I have to do some calculations manually. :(
>
> The dot product of vectors is very trivial to calculate.
>
> http://en.wikipedia.org/wiki/Dot_product
>
Uh, wait.. Thought dot product in this case was the equivalent of matrix
multiplication, that page implies that the vector results in a single
value, not another vector... So, what I posted in my second reply to
John was wrong?
--
void main () {
if version = "Vista" {
call slow_by_half();
call DRM_everything();
}
call functional_code();
}
else
call crash_windows();
}
<A HREF='http://www.daz3d.com/index.php?refid=16130551'>Get 3D Models,
3D Content, and 3D Software at DAZ3D!</A>
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
This should work, it totally negates the direction of the wind force if
hitting the "front" of the object.
objnorm = VecNorm(GetRot);
dot = wind.x * objnorm.x + wind.y * objnorm.y + + wind.z * objnorm.z;
if dot < 0
wind = -wind;
SetForce (wind);
Or did you want only the component of the wind perpendicular to the wall to
be negated?
if dot < 0
Wind = wind - 2 * dot * objnorm;
Or did you want the component of wind perpendicular to the wall to be zero
(as I think John explained)?
if dot < 0
Wind = wind - dot * objnorm;
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Patrick Elliott <sel### [at] npgcablecom> wrote:
> Uh, wait.. Thought dot product in this case was the equivalent of matrix
> multiplication, that page implies that the vector results in a single
> value, not another vector... So, what I posted in my second reply to
> John was wrong?
You are probably confusing it with the cross-product.
--
- Warp
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|