查看: 2852|回复: 1

[特效/Shader/技术美术] Unity3D中如何实现反射教程

[复制链接]

19

主题

19

听众

206

积分

Rank: 2

升级   2%

发表于 2012-12-30 21:45 |显示全部楼层
共享资源获取更多积分!share your resources get more credits!
资源信息 Tutorial Information
教程名称: Unity3D中如何实现反射教程(发布原创教程可获得更多积分哦!)
适用引擎: (资源适用引擎)
教程语种: 中文
教程等级: 小白(等级越高教程越难,但能学到的东西越多)
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
点击查看原图 --> 美丽分割线
请先回复
哇伊~ (((‵□′))回复太烦了,怒买VIP(充值金额将用于论坛采购更多资源)

--> 请先登录 --> 请先登录 --> 请先登录 --> 请先登录 --> 请先登录 --> 请先登录 -->

一.

float d = -Vector3.Dot (normal, pos) - m_ClipPlaneOffset; //原点到平面的距离

//可通过m_ClipPlaneOffset调整物体与反射物体之间的缝隙。

Vector4 reflectionPlane = new Vector4 (normal.x, normal.y, normal.z, d); //定义反射平面



备注:线性代数之平面
平面方程:Ax + By + Cz + w = 0;

这个方程的意义,可以看成两个向量的点击 N(A,B,C) V(x,y,z), N.dot(V) = -w; 向量N是一个常量向量,向量V代表一类向量。N可以看成平面的单位法向量,V可以看成平面上的点和原点的连线向量。则此时的w就有了特殊含义:原点到平面的距离。

如下图, N.dot(V) = A*x + B*y + C*z = |N| * |V| * cos(angle) = |V| * cos(angle) = distance;

角度angle为平面法线和向量V的夹角。

所以平面方程可以表示为法向量和距离的二元组。

plane = <Normal, distance>






更多延伸link

二.

   Matrix4x4 reflection = Matrix4x4.zero;
   CalculateReflectionMatrix (ref reflection, reflectionPlane); //通过反射平面生成反射矩阵
   Vector3 oldpos = cam.transform.position;
   Vector3 newpos = reflection.MultiplyPoint( oldpos ); //通过反射矩阵变换观察相机位置得到反射相机位置
   reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection; //通过反射矩阵变换观察相机世界矩阵生成反射相机世界矩阵

三.

   Vector4 clipPlane = CameraSpacePlane( reflectionCamera, pos, normal, 1.0f );  //生成反射相机裁剪平面
   Matrix4x4 projection = cam.projectionMatrix;
   CalculateObliqueMatrix (ref projection, clipPlane); //通过观察相机投影矩阵与裁剪平面生成非对称投影矩阵给反射相机
   reflectionCamera.projectionMatrix = projection;

四.

   GL.SetRevertBackfacing (true); //开启背面显示
   reflectionCamera.transform.position = newpos;
   Vector3 euler = cam.transform.eulerAngles;
   reflectionCamera.transform.eulerAngles = new Vector3(-euler.x, euler.y, euler.z);
   reflectionCamera.Render(); //渲染反射相机的内容到rtt
   reflectionCamera.transform.position = oldpos;
   GL.SetRevertBackfacing (false); //关闭背面显示



shader中通过ComputeScreenPos()直接生成投影坐标,在用tex2Dproj()采样即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

楼主热帖
已有 1 人评分鲜花 收起 理由
sea + 1 赞一个!

总评分: 鲜花 + 1   查看全部评分

认真总结可一下自己unity的日志

0

主题

26

听众

48

积分

Rank: 1

升级   24%

发表于 2016-12-19 11:11 |显示全部楼层

感谢楼主的无私分享!
回复

使用道具 举报

1

主题

10

听众

204

积分

Rank: 2

升级   1.33%

发表于 2017-2-12 13:45 |显示全部楼层
好帖就是要顶
回复

使用道具 举报

0

主题

10

听众

202

积分

Rank: 2

升级   0.67%

发表于 2017-2-12 13:05 |显示全部楼层
真心顶
回复

使用道具 举报

0

主题

10

听众

201

积分

Rank: 2

升级   0.33%

发表于 2017-2-12 13:41 |显示全部楼层
难得一见的好帖
回复

使用道具 举报

0

主题

10

听众

202

积分

Rank: 2

升级   0.67%

发表于 2017-2-12 13:04 |显示全部楼层
很好哦
回复

使用道具 举报

0

主题

10

听众

202

积分

Rank: 2

升级   0.67%

发表于 2017-2-12 13:15 |显示全部楼层
LZ真是人才
回复

使用道具 举报

0

主题

10

听众

203

积分

Rank: 2

升级   1%

发表于 2017-3-2 20:39 |显示全部楼层
很不错
回复

使用道具 举报

1

主题

26

听众

201

积分

Rank: 2

升级   0.33%

发表于 2017-3-2 21:06 |显示全部楼层
难得一见的好帖
回复

使用道具 举报

36

主题

14

听众

201

积分

Rank: 2

升级   0.33%

发表于 2017-3-2 21:25 |显示全部楼层
说的非常好
星期天 星期一 过度很痛苦
回复

使用道具 举报

温馨提示:求助请到“Unity技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

懒人模式:

关闭

站长推荐 上一条 /1 下一条

Unity3D游戏开发联盟(资源共享平台) -Unity3D,Unreal ( 粤ICP备20003399号-2 )   

GMT+8, 2020-4-8 04:30 , Processed in 0.121839 second(s), 82 queries .