Unity中Shader面片一直面向摄像机

本文介绍如何在Unity中通过Shader使模型面片始终保持面向摄像机。通过理解旋转矩阵,确定原坐标系和目标坐标系,计算Z、Y、X轴基向量,并应用向量乘法或矩阵乘法实现顶点旋转,最终达到面片始终面对摄像机的效果。适合用于特效、公告牌等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在之前的文章中,我们实现了Shader的序列帧动画。

但是,我们会发现,我们的面片不会一直面向摄像机,当摄像机移动时,人物或特效就会出现穿帮的效果。所以,我们接下来就来实现让我们的面片面向摄像机。

类似的功能,还可能用于:特效、公告牌、八方旅人风格效果、饥荒风格效果。


一、实现思路

1、 我们要实现模型面片一直跟着摄像机旋转,那么就需要用到旋转矩阵

2、确定 原坐标系 和 目标坐标系

  • 原坐标系 就是模型的本地坐标
    在这里插入图片描述
  • 目标坐标系
    因为我们的面片需要一直朝向摄像机。
    所以,可以确定旋转后的坐标系Z轴方向 需要 和 原模型本地空间坐标系原点 指向 摄像机 方向一致。
    在这里插入图片描述

3、确定旋转后坐标系基向量


二、确定旋转后 坐标系基向量 在 原坐标系 下的值

1、Z轴基向量

  • 求 摄像机坐标 在模型本地空间下的坐标值,在 归一化后 就是 Z轴基向量

float3 viewDir = mul(GetWorldToObjectMatrix(),float4(_WorldSpaceCameraPos,1)).xyz;

2、假设Y轴基向量 和 世界空间下 的Y轴方向一致竖直向上

在这里插入图片描述

float3 upDir = float3(0,1,0);

3、X轴基向量

  • X轴基向量 = Z轴基向量 × Y轴基向量

  • 叉积 的顺序取决于 坐标系类型 (逆时针叉积)

  • 模型本地空间坐标系为左手坐标系
    在这里插入图片描述

  • 左手坐标系中,X轴 = 食指 × 拇指 = Z × Y

float3 rightDir = normalize(cross(viewDir,upDir));

4、Y轴基向量

  • Y轴基向量 = X轴基向量 × Z轴基向量
  • 叉积 的顺序取决于 坐标系类型 (逆时针叉积)
  • 模型本地空间坐标系为左手坐标系
  • 左手坐标系中,Y轴 = 中指 × 食指 = X × Z

upDir = normalize(cross(rightDir,viewDir));


三、顶点应用旋转

法一:向量乘法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠溪泽岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值