How to find theta of view-direction on texture space?

Started by
1 comment, last by cavatina 17 years, 6 months ago
hi all, I encode theta information in another texture image using pre-processing and apply it to my pixel shader program. Because I need viewing direction information to lookup texture. I already trasform view vector to tangent space and using atan(y/x) to find theta. But the theta simily not match on the texture's theta I encode. Could someone give me a hint how to do such thing? In fact, I encode visibility information on a texture depend on theta of view direction using pre-processing. For example, a 2D 512*512 texture image. Each pixel has theta information and I define north direction is Y axis(or PI/2) and east direction is X axis(or 0 or 2*PI), etc... I want to render a planar with a texture and using the additional texture which has theta info encoded. Hope someone could help me...my math is too poor to derive such operation... thx... cavatina [Edited by - cavatina on September 27, 2006 12:38:26 PM]
Advertisement
Presumably, the problem lies in calculation of the 'theta' value. Either that, or your pre-processing stage is awry, in which case you're on your own [wink].

I don't fully understand what you're doing, but I know that many people have problems with angle-vector conversion. First, could you tell us what formula you are using to transform the view vector, in particular which of your three coordinates are mapping to x, y in the two atan(x/y)s?
Second, note that tan is pi-periodic, whereas sin & cos are 2-pi periodic. A consequence of this is that atan(y/x) is only 'correct' half of the time: atan(a/b) = atan(-a/-b) although the source vectors point in opposite directions. An easy way to fix this in C++ is to use atan2(x, y).

If you're still at a loss, perhaps you could describe what is wrong with your results or perhaps provide a screenshot. If the final image doesn't resemble the source at all, you may have scaling issues, but if it is reflected/offset/wrapped, it's probably a trig issue. There are many other possibilities but I won't go into them just now.

Regards
Admiral
Ring3 Circus - Diary of a programmer, journal of a hacker.
Quote:Original post by TheAdmiral
Presumably, the problem lies in calculation of the 'theta' value. Either that, or your pre-processing stage is awry, in which case you're on your own [wink].

I don't fully understand what you're doing, but I know that many people have problems with angle-vector conversion. First, could you tell us what formula you are using to transform the view vector, in particular which of your three coordinates are mapping to x, y in the two atan(x/y)s?
Second, note that tan is pi-periodic, whereas sin & cos are 2-pi periodic. A consequence of this is that atan(y/x) is only 'correct' half of the time: atan(a/b) = atan(-a/-b) although the source vectors point in opposite directions. An easy way to fix this in C++ is to use atan2(x, y).

If you're still at a loss, perhaps you could describe what is wrong with your results or perhaps provide a screenshot. If the final image doesn't resemble the source at all, you may have scaling issues, but if it is reflected/offset/wrapped, it's probably a trig issue. There are many other possibilities but I won't go into them just now.

Regards
Admiral

Thanks for your kind reply.
I use n, t, b to transform view vector into tangent space in vertex shader =>
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * Tangent);
vec3 b = cross(n, t);
v.x = dot(vVec, t);
v.y = dot(vVec, b);
v.z = dot(vVec, n);

Then in pixel shader, I use "theta = atan2(vVec.y, vVec.x)" to replace "theta = atan(vVec.y, vVec.x)" that I use originally. The result seems correct now.
Thanks a lot!!! :)

This topic is closed to new replies.

Advertisement