游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1826|回复: 0

请问怎样根据水面波动的高度方程求法线和切线、副法线?

[复制链接]

15

主题

62

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2009-7-17 19:54:00 | 显示全部楼层 |阅读模式
水面的顶点高度计算出来以后,我自己按照求导做的,不知道问题出在哪里。。。我的hlsl代码如下:

  1. float2 EvaluateWave( Wave w, float2 vPos, float time )
  2. {
  3. float ldist = sqrt(w.vDir.x * w.vDir.x + w.vDir.y * w.vDir.y);
  4. float dist = dot(w.vDir , vPos) / ldist;
  5. float hight = w.fAmp * sin( time * 2 * 3.14 * w.fFreq + dist / (w.fLmd * w.fFreq) );  //Asin(wt + dot(dir,pos) / v)
  6. float k = w.fAmp / ldist / w.fLmd / w.fFreq * cos( time * 2 * 3.14 * w.fFreq + dist / (w.fLmd * w.fFreq) );  //A/|dir|/L / f * cos(wt + dot(dir,pos) / v)
  7. float2 ret = float2(hight , k);
  8. return ret;
  9. }
  10. float tx = 0.0f; float bz = 0.0f;
  11. for( int i = 0; i != 2; i++ )
  12. {
  13. float2 ret = EvaluateWave( Waves[i], Pos.xz, fTime); float k = ret.y;
  14.         Out.Pos.y += ret.x;   
  15.       tx += k * Waves[i].vDir.x;// / sqrt(Waves[i].vDir.x * Waves[i].vDir.x + Waves[i].vDir.y * Waves[i].vDir.y);
  16.          bz += k * Waves[i].vDir.y;// / sqrt(Waves[i].vDir.x * Waves[i].vDir.x + Waves[i].vDir.y * Waves[i].vDir.y);      
  17.       }   
  18.   float3 vT = normalize(float3(tx , 2 , 0));   
  19. float3 vB = normalize(float3(0 , 2 , bz));  
  20.    float3 vN = cross(vT , vB);
复制代码

可是效果总是觉得不对。。。到底该怎么做呢????
请教高手!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-19 20:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表