Just thinking out loud, but maybe something like:

mat3 ToWorldNormalMatrix = mat3(osg_ViewMatrixInverse) * gl_NormalMatrix;

(hopefully the GLSL mat3(mat4) conversion does the right thing, I've
never tried it)

While cramming a normal into a vec4 may be convenient (albeit
inefficient) code-wise, it's conceptually wrong.  A normal is not a
homogenous point, it describes the orientation a plane, which is why
it has its own matrix.  See the GL Red Book, Appendix F "Transforming
Normals" for explanation.

-- mew



On Tue, May 27, 2008 at 9:12 PM, guilianzhang <[EMAIL PROTECTED]> wrote:
> Hello Mike and Paul,
>
> I can easily get the point transformation matrix in this way:
>>> mat4 ToWorldMatrix = osg_ViewMatrixInverse* gl_ModelViewMatrix;
>>> WorldPos= ToWorldMatrix * gl_Vertex;
>
> How can I get the inverse transpose of the ToWorldMatrix and set its
> translation part to zero? There seems to be no inverse and transpose
> funtions in glsl.
>
> Thank you very much!
> ________________________________
> guilianzhang
> 2008-05-28
> ________________________________
> 发件人: Mike Weiblen
> 发送时间: 2008-05-28 01:36:52
> 收件人: OpenSceneGraph Users
> 抄送:
> 主题: Re: [osg-users] Getting world space normal
>
> Well, not so much a requirement as OpenGL convention.
>
> GL defines a normal as a 3-component vector (there are only the
> glNormal3*() calls, unlike glVertex which has many sizes)
>
> And the GLSL builtins : gl_NormalMatrix is a mat3 and gl_Normal is a vec3.
>
> But sure, you can make the math with larger number of components.
>
> -- mew
>
>
>
> On Tue, May 27, 2008 at 9:41 AM, Paul Melis  <[EMAIL PROTECTED] > wrote:
>> Mike Weiblen schreef:
>> >
>> > Normals must be transformed by a normal matrix (which is a mat3).  It
>> > is not correct to promote a normal to a vec4 and try to use the
>> > transformation matrix (which is a mat4).
>> >
>>
>> Just curious: the mat3 requirement comes from the OpenGL shading language?
>> As mathematically there's nothing wrong with representing a normal with (x,
>> y, z, 1) as long as the 4x4 matrix being multiplied with is the inverse
>> transponse of the point transformation (as you remarked) and has a zero
>> translation part.
>>
>> Paul
>> >
>> > You'll need to generate a new normal matrix, which is defined as the
>> > upper-left mat3 of the inverse transpose of the transformation matrix.
>> >
>> > -- mew
>> >
>> >
>> >
>> >
>> > On Tue, May 27, 2008 at 8:30 AM, zhangguilian  <[EMAIL PROTECTED] >
>> > wrote:
>> >
>> > >
>> > > Hi,
>> > >
>> > > I want to get the normal in world space, I can not use
>> >
>> > > > gl_NormalMatrix because it will translate the normal from local space 
>> > > > to
>> > > eye
>> > > space, from you hint I do in this way:
>> > >
>> > > mat4 ToWorldMatrix = osg_ViewMatrixInverse* gl_ModelViewMatrix;
>> > > WorldPos= ToWorldMatrix * gl_Vertex;
>> > >
>> > >  vec4 normal=vec4(gl_Normal,0.0);
>> > >  WorldNrm= (ToWorldMatrix * normal).xyz;
>> > >  WorldNrm=normalize(WorldNrm);
>> > >
>> >
>> > > > the worldpos seems right, but worldNrm seems has problem, Can I get the
>> > > world space normal in this way?
>> > >
>> > > Thanks very much for your consideration!
>> > >
>> > > ________________________________
>> > > zhangguilian
>> > > 2008-05-27
>> > > _______________________________________________
>> > > osg-users mailing list
>> > > [email protected]
>> >
>> > > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>> > >
>> > >
>> > >
>> >
>> >
>> >
>> >
>>
>> _______________________________________________
>> osg-users mailing list
>> [email protected]
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>
>
>
> --
> Mike Weiblen -- Austin Texas USA -- http://mew.cx/
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>



-- 
Mike Weiblen -- Austin Texas USA -- http://mew.cx/
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to