unity3d 面片朝向摄像机_unity3d怎么让镜头一直朝向摄像机 - CSDN
  • unity3d中的单面片类的植物或人物永远朝向相机,使用方法是将脚本拖拉至面片类物体上.
  • 这个时候通常做的就是,用2D面片实现3D效果,让正面一直朝向相机 我们可以通过旋转物体来实现,也可以通过计算物体的屏幕坐标利用UI相机来实现,也可以通过shader来实现 用shader实现的思想是这样的,通过重新建立...

    在做游戏的时候,有时候会出现很多道具在场景之中

    如果用3D建模去实现,会比较耗性能

    这个时候通常做的就是,用2D面片实现3D效果,让正面一直朝向相机

    我们可以通过旋转物体来实现,也可以通过计算物体的屏幕坐标利用UI相机来实现,也可以通过shader来实现

    用shader实现的思想是这样的,通过重新建立物体的模型坐标系,使得z轴始终朝向相机就可以了

    问题在于x跟z轴如何确定

    通过脑补,我们可以发现,当坐标系朝向相机时,满足x=cross((0,1,0),view)

    又因为要建立正交坐标系,再用y = cross(z,x)就可以了

    其中,z=view

    当然因为是单位向量,都要做归一化操作,这里就省略了

    重建坐标系之后,算出新的模型空间下的顶点坐标即可

    Shader "Test/Unity Shaders Book/Chapter 11/BillboardTest" 
    {
        Properties
        {
            _MainTex("MainTex",2D)="white"{}
        }

        SubShader
        {
            Tags {"DisableBatching"="True"}
            Pass
            {
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha

                CGPROGRAM

                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                sampler2D _MainTex;

                struct a2v
                {
                    float4 vertex : POSITION;
                    float4 texcoord : TEXCOORD0;
                };

                struct v2f
                {
                    float4 vertex : SV_POSITION;
                    float2 texcoord : TEXCOORD0;
                };

                v2f vert(a2v v)
                {
                    v2f o;
                    float3 view = mul(unity_WorldToObject,float4(_WorldSpaceCameraPos,1));
                    //这里取负数比较费解,不取的话会被cull掉,因为算出来的正反面相反
                    //我猜测,可能是哪里坐标系的旋性是相反导致的
                    float3 zDir = -normalize(view);
                    float3 yDir = float3(0,1,0);
                    //处理朝向跟y轴重合的情况,脑补一下,就知道此时用(1,0,0)和(0,0,1)算都是可以的
                    if(zDir.y>=0.999||zDir.y<=-0.999)
                    {
                        yDir = float3(0,0,1);
                    }
                    float3 xDir = normalize(cross(yDir,zDir));
                    yDir = normalize(cross(zDir,xDir));
                    float3 modelPos = v.vertex.x*xDir+v.vertex.y*yDir+v.vertex.z*zDir;
                    o.vertex = UnityObjectToClipPos(float4(modelPos,1));
                    o.texcoord = v.texcoord;
                    return o;
                }

                fixed4 frag(v2f f):SV_TARGET
                {
                    fixed4 o = tex2D(_MainTex,f.texcoord);
                    return o;
                }

                ENDCG
            }
        }

    }

    这个系列主要是通过阅读《Unity Shader入门精要》之后的一些感想,给读者一些启发。
    联系邮箱:glasirius@gmail.com

    展开全文
  • 修改unity 内置shader Particles/Additive 为增加 BIllboard功能 上代码Shader "Particles/AddtiveBillboard" { Properties { _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) _MainTex ("Particle ...

    修改unity 内置shader Particles/Additive 为增加 BIllboard功能
    上代码

    Shader "Particles/AddtiveBillboard" {
    Properties {
        _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
        _MainTex ("Particle Texture", 2D) = "white" {}
        _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
    }
    
    Category {
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        Blend SrcAlpha One
        AlphaTest Greater .01
        ColorMask RGB
        Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
    
        SubShader {
            Pass {
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma multi_compile_particles
    
                #include "UnityCG.cginc"
    
                sampler2D _MainTex;
                fixed4 _TintColor;
    
                struct appdata_t {
                    float4 vertex : POSITION;
                    fixed4 color : COLOR;
                    float2 texcoord : TEXCOORD0;
                };
    
                struct v2f {
                    float4 vertex : SV_POSITION;
                    fixed4 color : COLOR;
                    float2 texcoord : TEXCOORD0;
                    #ifdef SOFTPARTICLES_ON
                    float4 projPos : TEXCOORD1;
                    #endif
                };
    
                float4 _MainTex_ST;
    
                v2f vert (appdata_t v)
                {
                    v2f o;
                    //o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);//这里是原有的vertex 赋值代码,注释掉
                    //****************这里修改的vertex赋值代码*******************
                    float4 ori=mul(UNITY_MATRIX_MV,float4(0,0,0,1));
                    float4 vt=v.vertex;
                    vt.y=vt.z;
                    vt.z=0;
                    vt.xyz+=ori.xyz;
                    o.vertex=mul(UNITY_MATRIX_P,vt);
                    //******************************
                    #ifdef SOFTPARTICLES_ON
                    o.projPos = ComputeScreenPos (o.vertex);
                    COMPUTE_EYEDEPTH(o.projPos.z);
                    #endif
                    o.color = v.color;
                    o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                    return o;
                }
    
                sampler2D_float _CameraDepthTexture;
                float _InvFade;
    
                fixed4 frag (v2f i) : SV_Target
                {
                    #ifdef SOFTPARTICLES_ON
                    float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));
                    float partZ = i.projPos.z;
                    float fade = saturate (_InvFade * (sceneZ-partZ));
                    i.color.a *= fade;
                    #endif
    
                    return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
                }
                ENDCG 
            }
        }   
    }
    }
    
    展开全文
  • 公告板技术是3D游戏中用的非常多的一种技术,主要是用于控制场景中的Texture的方向,让他始终以一定的角度对着我们的镜头(一般是垂直于镜头)。 如我们在3D游戏中看到的怪物的蓝、红和怪物名字、一些花草树木等,...
    公告板技术是3D游戏中用的非常多的一种技术,主要是用于控制场景中的Texture的方向,让他始终以一定的角度对着我们的镜头(一般是垂直于镜头)。
    如我们在3D游戏中看到的怪物的蓝、红和怪物名字、一些花草树木等,无论我们在哪个方向看它总是对着我们。

    如下图所示:

    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class LookAtCameraYRotationOnly : MonoBehaviour  
    5. {  
    6. public Camera cameraToLookAt;  
    7.   
    8. void Update()   
    9. {  
    10. Vector3 v = cameraToLookAt.transform.position - transform.position;  
    11. v.x = v.z = 0.0f;  
    12. transform.LookAt(cameraToLookAt.transform.position - v);   
    13. }  
    14. }  

    展开全文
  • 新建一个Cube,在 Cube下建一个Canvas, Render mode 改成World Space,Scale调0.01 Canvas下建Text, 在Canvas挂上下面脚本。 using UnityEngine; public class Billboard : MonoBehaviour { Transform m_Camera;...

    新建一个Cube,在 Cube下建一个Canvas, Render mode 改成World Space,Scale调0.01 Canvas下建Text, 在Canvas挂上下面脚本。

    在这里插入图片描述

    using UnityEngine;
    
    public class Billboard : MonoBehaviour {
    
    Transform m_Camera;
    
    void Start(){
    	// 获取场景里的main camera
    	m_Camera = Camera.main.transform;
    }
    
    // 用LateUpdate, 在每一帧的最后调整Canvas朝向
    void LateUpdate () {
    	if(m_Camera == null){
    		return;
    	}
    	// 这里我的角色朝向和UI朝向是相反的,如果直接用LookAt()还需要把每个UI元素旋转过来。
    	// 为了简单,用了下面这个方法。它实际上是一个反向旋转,可以简单理解为“负负得正”吧
    	transform.rotation = Quaternion.LookRotation (transform.position - m_Camera.position);
    	}
    }
    
    展开全文
  • 摄像机 1.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中? LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update...
    摄像机
    1.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?

    LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。


    2.一个场景放置多个camera并同时处于活动状态,会发生什么

    答:游戏界面可以看到很多摄像机的混合。可以用depth(深度),Layer(层)+ Culling Mask,enable = false/true来控制


    射线
    射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射。
    注意这条件是逻辑上的,界面上看不到。
    一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。
    1:Raycast碰撞的物体。
    1:RaycastAll碰撞的所有物体。


    动画
    1.请描述游戏动画有哪几种,以及其原理?
    主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
    a.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一 个整体的动画,角色比较灵活,Quake2中使用这种动画;
    b.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
    c.单一网格模型动画由一个 完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。


    2.动画层(Animation Layers)的作用是什么?
    动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画


    3.写出Animation的五个方法
    AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样


    碰撞

    1.Unity3d中的碰撞器和触发器的区别?

    碰撞器有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter\/Stay\/Exit函数;
    触发器没有碰撞效果,IsTrigger=true,可以调用OnTriggerEnter\/Stay\/Exit函数。


    2.碰撞检测需要物体具备什么属性?

    能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器
    【Physics.Overlapsphere相交球检测碰撞,碰撞检测需要包围盒】


    3.在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数

    三个阶段 1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit

    什么是协同程序?
    在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。
    换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。


    1.UGUI的三种渲染模式,以及他们的作用?

    (1)Screen Space-Overlay(屏幕控件-覆盖模式)的画布会填满整个屏幕空间,并将画布下面的所有的UI元素置于屏幕的最上层,或者说画布的画面永远“覆盖”其他普通的3D画面,如果屏幕尺寸被改变,画布将自动改变尺寸来匹配屏幕

    (2)Screen Space-Camera(屏幕空间-摄影机模式)和Screen Space-Overlay模式类似,画布也是填满整个屏幕空间,如果屏幕尺寸改变,画布也会自动改变尺寸来匹配屏幕。所不同的是,在该模式下,画布会被放置到摄影机前方。在这种渲染模式下,画布看起来 绘制在一个与摄影机固定距离的平面上。所有的UI元素都由该摄影机渲染,因此摄影机的设置会影响到UI画面。在此模式下,UI元素是由perspective也就是视角设定的,视角广度由Filed of View设置。

    (3)World Space即世界控件模式。在此模式下,画布被视为与场景中其他普通游戏对象性质相同的类似于一张面片(Plane)的游戏物体。画布的尺寸可以通过RectTransform设置,所有的UI元素可能位于普通3D物体的前面或者后面显示。当UI为场景的一部分时,可以使用这个模式。  它有一个单独的参数Event Camera,用来指定接受事件的摄像机,可以通过画布上的aphicRaycaster组件发射射线产生事件。


    2.ref参数和out参数是什么,分别有什么作用?

    ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。
    使用ref前必须对变量赋值,out不用。
    out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。 


    3.transform.localposition和transform.position有什么区别?

    transform.localposition是自身坐标 ,transform.position是世界坐标
    TransformPoint
    function TransformPoint (position : Vector3) : Vector3
    function TransformPoint (x : float, y : float, z : float) : Vector3

    把一个点从自身相对坐标转换到世界坐标


    4.GameObject.Find和Trandform.Find有什么区别 ?

    GameObject.Find通过名字或路径查找游戏对象。
    (1).无法查找隐藏对象 
    隐藏对象包括查找路径的任何一个父节点隐藏(active=false)
    (2).如果查找不在最上层,建议合理使用路径查找,路径查找是把双刃剑
    优点1:解决查找中可能出现的重名问题。 
    优点2:如果有完全的路径,减少查找范围,减少查找时间。
    缺点: 路径或结构调整后,容易影响到程序中的查找,需要重新定位查找路径。
    (3).如果路径查找中的任何一个父节点active=false,这个对象都将查找不到。
    (4).使用方便但效率低下 
    此查找相当于递归遍历查找,虽使用方便但效率堪忧,建议在Start()函数中查找对象并保存引用,切忌在Update()中动态查找。
    Transform.Find
    (1).可以查找隐藏对象 
    (2).支持路径查找 
    (3).查找隐藏对象的前提是transform所在的根节点必须可见,即active=true


    5.值类型和引用类型的区别?

    (1).值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,
        而内存单元中只存放堆中对象的地址。
    (2).值类型存取速度快,引用类型存取速度慢。
    (3).值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
    (4).值类型继承自System.ValueType,引用类型继承自System.Object
    (5).栈的内存分配是自动释放;而堆在.NET中会有GC来释放       
    (6).值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
    (7).值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际
    数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储
    可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量
    占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两
    个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用
    ,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,
    因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这
    个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保
    存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。


    6.C#String类型比StringBuilder类型的优势是什么?

    如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder类要强。


    7.灯光有那四种类型列举出来?

    Point Lights 点光源丶Spot Lights 聚光灯丶Directional Lights 方向光源 丶 ambient light 环境光丶 Area Light,俗称面灯
    U3D中有四种类型的灯光:PointLight,Spotlight,DirectionalLight,AreaLight,AmbientLight。其中,AmbientLight不是独立的灯光元素,而是位于渲染设置中,可对场景中的背光进行色彩调节(通常是冷色系),用于模拟环境反射光(多为天光)。方向光常用于模拟阳光,灯光的所在位置不影响照明效果,因为它是基于朝向的。


    8.装箱和拆箱的概念以及过程?

    装箱就是值类型到引用类型的转化过程。首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内存地址。
    装箱操作是可逆的,所以还有拆箱操作。拆箱操作获取指向对象中包含值类型部分的指针,然后由程序员手动将其对应的值拷贝给值类型变量。


    9.UGUI和NGUI分别是怎样控制深度的?

    NGUI的深度就是一个指定的数值,数值越大越靠前

    UGUI控制显示顺序的深度不是值,而是位置。只要通过管理UI控件的位置,就可以很好的管理UI的显示顺序。


    10.如何定义和使用一个协同程序,以及对协同程序的理解?
    展开全文
  • unity3D的面试题

    2016-11-16 16:04:39
    第一部分 1.请简述值类型与引用类型的区别 2.C#中所有引用类型的基类是什么 ...3.请简述ArrayList和List的主要区别 ...4.请简述GC(垃圾回收)产生的原因,并描述如何避免?...8.请简述关键字Sealed
  • Unity3D-UGUI常用组件

    2019-12-08 21:58:54
    UGUI:unity graphic user interface(Unity图形用户界面) NGUI:外部插件 UGUI:unity自带的UI(在NGUI的基础上创建) 1.创建UI(层级面板)-create-ui Canvas:画布(所有的UI都必须作为canvas的子物体)(以像素为...
  • Unity3d mesh 学习

    2020-04-19 16:47:08
    任意复杂的模型都是由三角形面组成 网格数据(Mesh Data) 顶点坐标 vertices:保存的是模型所有坐标的数组纹理坐标UV :定义模型中顶点和贴图之间的位置关系,如何把一张图片贴在模型表面,uv是坐标2维的. ...
  • 关于billboard技术,原理就是计算出来一个始终朝向摄像机面片,可以在CPU里计算,也可以在GPU里实现。应用的场合很多: 游戏角色的头顶文字,血条 场景的树,草 特效粒子片 3d场景里的2d角色 ...
  • Project(工程、项目):工程是把游戏开发当前所需要的资源归类管理用的。 Console控制台:日志、报错、调试,右上角,消息过滤 ...UnityPackageManager:资源包 工程迁移: Assets、Pr...
  • Unity3D自带功能:树物体(Tree) 通过菜单GameObject > 3D Object > Tree可以为当前场景创建一个Tree (树),同时还会把相应的Tree asset资源存放在项目文件夹中。 unity_tree_01.png Tree是标准的Fractal...
  • 通过跟踪头部运动,设置一个代表光标的准星,碰触物体后改变位置和朝向,贴近被凝视物体。物体a被凝视一定时间后消失,物体b被凝视一定时间后被击中 实现原理 1、基于射线原理,Update—>Raycast 2、准星或...
  • [UnityShader学习笔记] UnityShader中透明效果及相关原理(深度缓存、深度测试、深度写入和面片剔除等)
  • Unity Cull 背面剔除

    2019-07-30 19:24:13
    面剔除就是指检查一个面相对于摄像机也就是观察者的朝向是顺时针还是逆时针,以三角形举例,如果一个三角形我们从正面看它是顺时针,那么背面就是逆时针,以此来区分正面和被面。 在unity里默认的就是背面剔除,...
  • unity3D面试题

    2018-04-19 18:23:32
    第一部分1.请简述值类型与引用类型的区别2.C#中所有引用类型的基类是什么3.请简述ArrayList和List&lt;Int&gt;的主要区别4....5.请描述Interface与抽象类之间的不同6....7.下列代码在运行中会发生什么问题?...
  • Unity Shader数学基础

    2018-09-08 14:48:57
    目录 一、三维笛卡尔坐标系 1.1 左右手坐标系判断 1.2 左右手坐标系旋转正方向判断 1.3 其它 二、点和矢量 三、矢量运算 3.1 矢量和标量的乘/除法 3.2 矢量的加减法 3.3 矢量的模 ...3.6 矢...
  • Unity编辑器基础

    2017-12-01 10:01:38
    一丶题目: 请描述游戏动画有几种,以及其原理。 答案: 主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整 ...
  • 3D图形学基础 Lingtonke(柯灵杰) 1 前言 现在AR、VR技术正值风口,催生了一大批相关的APP,使得3D图像学不再是游戏开发人员的专属知识,而是更多的普及开来。 本文主要针对一些对3D有兴趣的同学,普及图形学...
  • 通过绘制连续项链的面片(始终朝向摄像机)组成的"带子",对这个带子模型使用纹理动画切换不同帧的纹理就实现了对应的效果。这个"带子"是3D空间的曲线,可以任意指定起点,中间若干点,终点. 转载于:...
1 2 3 4
收藏数 62
精华内容 24
关键字:

unity3d 面片朝向摄像机