顶点动画-广告牌

1、广告牌效果是什么

广告牌效果是一种图形技术,用于确保对象(通常是二维纹理面片 或 精灵(Sprite)图片)始终面向摄像机,同时在某些轴上保持固定的方向(一般分为全向广告牌和轴对齐广告牌)
在3D游戏中非常有用,它可以确保无论从哪个角度看、对象始终面向玩家,创造出一种始终可见的效果。

全向广告牌效果 是无论摄像机位置如何变化,对象在所有轴上始终面向摄像机。适用于 烟雾、火焰等需要从任何角度看都要正对摄像机的效果

轴对齐广告牌 是对象在一个特定轴上保持固定方向,而在其他轴上面向摄像机,适用于 树木、花草、人物等需要在特定轴上保持正确方向的效果
其中 垂直广告牌 就是一种特殊的轴对齐广告牌,对象在水平面(XZ平面)上旋转
但在垂直方向上始终保持不变

2、广告牌效果基本原理

想要实现广告牌效果,核心原理是旋转模型空间坐标系让其始终面向摄像机
想要达到这个目的,我们需要构建一个基于模型空间的新坐标系
坐标系由两个关键因素决定

  • 原点(新坐标系中心点):基于模型空间的,可以自定义,但一般还是用(0,0,0)
  • 三个轴向(X轴、Y轴、Z轴):通常情况下三个轴向由视角方向、垂直向上方向、右方向 构成

关键就是求出三个轴向(X,Y,Z)

  • Z轴 = normal = 将摄像机位置转到模型空间 – 模型空间下新轴向空间中心点(一般还是0,0,0),old Up = 模型空间中Y轴(0,1,0)
  • X轴 = right = Normal  X OldUp (两个向量叉乘可以得到垂直于两向量所在平面的向量)
  • Y轴 = new Up = Normal  X Right

再定义一个新坐标系的中心点(相对于模型空间的),一般我们会将中心点Center定为(0,0,0)即原模型空间原点,那么此时我们只需要计算以下两步即可:
偏移位置 = 顶点坐标 – Center
新顶点位置 = Center + X轴 * 偏移位置.x + Y轴 * 偏移位置.y + Z轴 * 偏移位置.z

如果想要实现出 垂直广告牌效果,那只需要在计算轴向向量时进行修改即可,只需要在计算normal向量时,让其的y值变为0即可,相当于normal向量只在 xz 平面变化

3、实现

Shader "ShaderProj/8/Billboarding"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
        //用于控制垂直广告牌和全向广告牌的变化
        _VerticalBillboarding("VerticalBillboarding", Range(0,1)) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True" "DisableBatching"="True"}

        Pass
        {
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            Cull Off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            float _VerticalBillboarding;

            v2f vert (appdata_base v)
            {
                v2f o;
                float3 center = float3(0, 0, 0);
                float3 cameraInObjectPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
                float3 normalDir = cameraInObjectPos - center;
                normalDir.y *= _VerticalBillboarding;
                normalDir = normalize(normalDir);
                //模型空间下的Y轴正方向 (0,1,0)作为它的 old up
                //为了避免z轴和(0,1,0)重合 ,因为重合后再计算叉乘 可能会得到0向量
                float3 upDir = normalDir.y > 0.999 ? float3(0, 0, 1) : float3(0, 1, 0);
                float3 rightDir = normalize(cross(upDir, normalDir));
                upDir = normalize(cross(normalDir, rightDir));

                float3 centerOffset = v.vertex.xyz - center;
                float3 newVertexPos = center + rightDir * centerOffset.x + upDir * centerOffset.y + normalDir * centerOffset.z;
                o.vertex = UnityObjectToClipPos(float4(newVertexPos, 1));

                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float4 color = tex2D(_MainTex, i.uv);
                color.rgb *= _Color.rgb;
                return color;
            }
            ENDCG
        }
    }
}

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
### 关于C++中广告牌(Billboarding)渲染的实现 广告牌技术通常用于模拟面向摄像机的对象,例如树木、火焰或其他复杂几何体的简化表示。以下是基于引用内容以及专业知识总结的一种常见实现方式。 #### 1. 广告牌的概念及其用途 广告牌是一种常见的图形学技巧,主要用于优化性能并减少绘制复杂对象所需的计算量。通过使纹理始终朝向摄像机,可以显著降低模型的多边形数量,从而提高渲染效率[^2]。 #### 2. C++中的基本实现步骤 在C++中实现广告牌渲染主要涉及以下几个核心部分: - **顶点变换** 使用视图矩阵和投影矩阵将顶点位置转换到屏幕空间,并确保其始终正对摄像机的方向。这可以通过修改顶点着色器中的法线或旋转矩阵来实现[^3]。 ```cpp // 计算广告牌方向的核心逻辑 glm::vec3 billboardDirection = glm::normalize(cameraPosition - objectPosition); modelMatrix = glm::mat4(1.0f); // 初始化单位矩阵 modelMatrix = glm::translate(modelMatrix, objectPosition); // 移动到物体位置 modelMatrix = glm::rotate(modelMatrix, angle, axis); // 绕轴旋转以匹配摄像机视角 ``` - **纹理映射** 将二维纹理应用到四边形上,使其看起来像一个三维对象。此过程依赖于OpenGL或DirectX等API的支持。 ```cpp // OpenGL绑定纹理示例 glBindTexture(GL_TEXTURE_2D, textureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 渲染四边形 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-size, -size, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(size, -size, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(size, size, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-size, size, 0.0f); glEnd(); ``` - **时间扭曲与动态更新** 如果需要进一步增强效果,可引入类似于时间扭曲的技术,以便实时调整广告牌的位置和角度,适应快速变化的场景。 #### 3. 进一步扩展与优化 为了提升视觉质量,还可以考虑以下高级特性: - **骨骼动画支持**:对于复杂的广告牌对象,如树叶摇曳的效果,可通过骨骼动画增加真实感。 - **后处理特效**:利用后期处理技术(如模糊或光照),让广告牌更加融入环境。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值