可直接使用的unity第三人称自由视角相机脚本

2023-10-31

使用方法:


将要控制的角色拖到TargetBody,将相机的焦点拖到CamerPivot,,建议CameraPivot是一个放在TargetBody下的子物体,并且位置应该是在TargetBody的头部.

注意:此脚本自动忽略"Ignore Raycast"层和"Mob"对相机视野的遮挡,也就是说,当相机被带有这两个层之一的物体遮挡时,相机不会自动移动到遮挡物之前,这是用于设置一些不应该触发相机防遮挡的物体用的,比如说怪物和玻璃等.




包含的功能有:

            1.控制人物转向,按下WASD按键时可直接控制目标物体(角色)插值转向.

            2.垂直视角限制,避免发生相机翻转的问题

            3.相机防遮挡


原理说明:

            1.通过四元数插值控制人物转向

            2.在unity中,水平视角的x欧拉角为0,向上直至垂直的欧拉角实际上为(0-90),而向下直至垂直的欧拉角实际上是(360-270).脚本中maxEvelation为最大仰角,maxDepression为最大俯角,假设此处最大俯角和最大仰角都为80,则在最大仰角达到80以上时,判断鼠标的输入,只有当鼠标输入为向下滑动时(此时鼠标的输入Input.getAxis("Mouse Y")>0)才允许滑动.同理,当最大俯角为80(360-80=280)时,此时实际上的欧拉角为280-270,所以当x<280时,则只允许向上滑动(此时鼠标的输入Input.getAxis("Mouse Y")<0))

如图所示:


代码:

 float eulerX = transform.localEulerAngles.x;//相机的x欧拉角,也就是垂直方向.
        float inputY = Input.GetAxis("Mouse Y");

        //垂直视野限制
        transform.RotateAround(CameraPivot.transform.position, CameraPivot.transform.up, rotateSpeed * Input.GetAxis("Mouse X"));
        if (eulerX > maxEvelation && eulerX < 90)
        {
            if (inputY > 0)
                transform.RotateAround(CameraPivot.transform.position, transform.right, -rotateSpeed * inputY);
        }
        else if (eulerX < 360-maxDepression && eulerX > 270)
        {
            if (inputY < 0)
                transform.RotateAround(CameraPivot.transform.position, transform.right, -rotateSpeed * inputY);
        }
        else
        {
            transform.RotateAround(CameraPivot.transform.position, transform.right, -rotateSpeed * inputY);

        }

            3.相机防遮挡


先提前检测(自己)相机的应该在位置,从相机目标向相机发射一条射线,如果碰撞了,说明即将碰撞.则直接把位置调到碰撞点位置,但此时的位置正好在平面里,相机的一部分视野会透视,所以应该在再向相机靠近一点.

transform.position = CameraPivot.transform.position + (wallHit - CameraPivot.transform.position) * 0.8f;

注意,这里是提前判断,如果是直接更新相机位置后发现被遮挡再把位置移动到碰撞点,相机就会在碰撞点和应在位置来回切换.效果自然是有问题的.

最后说明相机的位置更新方法:

        相机的旋转通过RotateAround()来以目标相机焦点为中心进行旋转.旋转后根据当前位置和相机焦点位置相减得到方向向量,然后用相机焦点位置+方向向量的单位向量*设置的距相机焦点的距离.

代码表示:

            offset = transform.position - CameraPivot.transform.position;
            offset = offset.normalized * freeDistance;
            transform.position = CameraPivot.transform.position + offset;

完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FreeTPSCamera : MonoBehaviour {
    [Header("相机距离")]
    public float freeDistance = 2;
    [Header("相机最近距离")]
    public float minDistance = 0.5f;
    [Header("相机最远距离")]
    public float maxDistance = 20;
    [Header("是否可控制相机距离(鼠标中键)")]
    public bool canControlDistance=true;
    [Header("更改相机距离的速度")]
    public float distanceSpeed = 1;

    [Header("视角灵敏度")]
    public float rotateSpeed = 1;
    [Header("物体转向插值(灵敏度,取值为0到1)")]
    public float TargetBodyRotateLerp = 0.3f;
    [Header("需要转向的物体")]
    public GameObject TargetBody;//此脚本能操作转向的物体
    [Header("相机焦点物体")]
    public GameObject CameraPivot;//相机焦点物体  
    [Header("===锁敌===")]
    public GameObject lockTarget=null;
    public float lockSlerp=1;
    public GameObject lockMark;
    private bool marked;

    [Header("是否可控制物体转向")]
    public bool CanControlDirection = true;
    [Header("俯角(0-89)")]
    public float maxDepression=80;
    [Header("仰角(0-89)")]
    public float maxEvelation=80;
    

    private Vector3 PredictCameraPosition;
    private Vector3 offset;
    private Vector3 wallHit;
    private GameObject tmpMark;
    // Use this for initialization
    void Start () {
        
        offset = transform.position - CameraPivot.transform.position;
        if (TargetBody == null)
        {
            TargetBody = GameObject.FindGameObjectWithTag("Player");
            Debug.Log("未绑定目标物体,默认替换为Player标签的物体");
        }
        if (!CameraPivot)
        {
            Debug.LogError("未绑定相机焦点物体");
        }

    }

    void LockTarget()
    {
        if(lockTarget)
        {
            lockTarget = null;
            marked = false;
            Destroy(tmpMark);
            return;
        }

        Vector3 top = transform.position + new Vector3(0, 1, 0)+transform.forward*5;
        LayerMask mask = (1 << LayerMask.NameToLayer("Mob")); //将物体的Layer设置为Ignore Raycast,Player和Mob来忽略相机的射线,不然相机将跳到某些物体前,比如怪物,玩家等,
      
        Collider[] cols = Physics.OverlapBox(top, new Vector3(0.5f,0.5f,5),transform.rotation,mask);
        foreach (var col in cols)
        {
            lockTarget = col.gameObject;
        }   
    }

    bool Inwall()
    {

        RaycastHit hit;
        LayerMask mask = (1 << LayerMask.NameToLayer("Player")) | (1 << LayerMask.NameToLayer("Ignore Raycast"))| (1 << LayerMask.NameToLayer("Mob"))|(1<<LayerMask.NameToLayer("Weapon")); //将物体的Layer设置为Ignore Raycast,Player和Mob来忽略相机的射线,不然相机将跳到某些物体前,比如怪物,玩家等,
        mask = ~mask;//将以上的mask取反,表示射线将会忽略以上的层
        //Debug.DrawLine(CameraPivot.transform.position, transform.position - transform.forward, Color.red);
        
        PredictCameraPosition = CameraPivot.transform.position + offset.normalized * freeDistance ;//预测的相机位置
        if (Physics.Linecast(CameraPivot.transform.position, PredictCameraPosition, out hit, mask))//碰撞到任意碰撞体,注意,因为相机没有碰撞器,所以是不会碰撞到相机的,也就是没有碰撞物时说明没有遮挡
        {//也就是说,这个if就是指被遮挡的情况


            wallHit = hit.point;//碰撞点位置
            //Debug.DrawLine(transform.position, wallHit, Color.green);
            return true;
        }
        else//没碰撞到,也就是说没有障碍物
        {
            return false;
        }


    }


    void FreeCamera()
    {
        offset = offset.normalized * freeDistance;
        transform.position = CameraPivot.transform.position + offset;//更新位置

        if (CanControlDirection)//控制角色方向开关
        {
            Quaternion TargetBodyCurrentRotation = TargetBody.transform.rotation;

            if (Input.GetKey(KeyCode.A))
            {
                if (Input.GetKey(KeyCode.W))
                {
                    TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y - 45, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);
                }
                else if (Input.GetKey(KeyCode.S))
                {
                    TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y - 135, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);
                }


                else if (!Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.S))
                {
                    TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y - 90, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);
                }
            }
            else if (Input.GetKey(KeyCode.D))
            {
                if (Input.GetKey(KeyCode.W))
                {
                    TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y + 45, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);
                }
                else if (Input.GetKey(KeyCode.S))
                {
                    TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y + 135, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);
                }

                else if (!Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.S))
                {
                    TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y + 90, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);
                }
            }
            else if (Input.GetKey(KeyCode.W))
            {
                TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);

            }
            else if (Input.GetKey(KeyCode.S))
            {
                TargetBody.transform.rotation = Quaternion.Lerp(TargetBodyCurrentRotation, Quaternion.Euler(new Vector3(TargetBody.transform.localEulerAngles.x, transform.localEulerAngles.y - 180, TargetBody.transform.localEulerAngles.z)), TargetBodyRotateLerp);

            }
        }

        if(canControlDistance)//控制距离开关
        {
            freeDistance -= Input.GetAxis("Mouse ScrollWheel") * distanceSpeed;
        }
        
        freeDistance = Mathf.Clamp(freeDistance, minDistance, maxDistance);

        if(!lockTarget)
        {

        
            transform.LookAt(lockTarget ? (lockTarget.transform.position ): CameraPivot.transform.position);
        }
        else
        {
            Quaternion tmp = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(lockTarget.transform.position - transform.position), lockSlerp*Time.fixedDeltaTime);
            transform.rotation = tmp;

        }

        float eulerX = transform.localEulerAngles.x;//相机的x欧拉角,也就是垂直方向.
        float inputY = Input.GetAxis("Mouse Y");


        if (!lockTarget)
        {
                //垂直视野限制
                if (!lockTarget)
            {
                transform.RotateAround(CameraPivot.transform.position, Vector3.up, rotateSpeed * Input.GetAxis("Mouse X"));//x不用限制
            }
        
            if (eulerX > maxDepression && eulerX < 90)//当向上角度越界时
            {
                if (inputY > 0)//如果鼠标时在向下滑动
                    transform.RotateAround(CameraPivot.transform.position, Vector3.right, -rotateSpeed * inputY);//允许滑动
            }
            else if (eulerX < 360-maxEvelation && eulerX > 270)
            {
                if (inputY < 0)
                    transform.RotateAround(CameraPivot.transform.position, Vector3.right, -rotateSpeed * inputY);
            }
            else//角度正常时
            {
            
                    transform.RotateAround(CameraPivot.transform.position, Vector3.right, -rotateSpeed * inputY);
           

            }
        }
        if (lockTarget)
        {
            offset = CameraPivot.transform.position - (lockTarget.transform.position);
        }
        else
        {
            offset = transform.position - CameraPivot.transform.position;//以上方向发生了变化,记录新的方向向量
        }
       
        offset = offset.normalized * freeDistance;

        ///在一次FixedUpdate中,随时记录新的旋转后的位置,然后得到方向,然后判断是否即将被遮挡,如果要被遮挡,将相机移动到计算后的不会被遮挡的位置
        ///如果不会被遮挡,则更新位置为相机焦点位置+方向的单位向量*距离
        ///
        if (Inwall())//预测会被遮挡
        {
            //print("Inwall");

            transform.position = CameraPivot.transform.position + (wallHit - CameraPivot.transform.position) * 0.8f;

            return;


        }
        else
        {
            transform.position = CameraPivot.transform.position + offset;
           
        }
    
    }

    // Update is called once per frame
    void FixedUpdate () {
        FreeCamera();
        if(lockTarget)
        {
            
            if (!marked)
            {
                tmpMark = Instantiate(lockMark, lockTarget.transform.position + new Vector3(0, 2.5f, 0), transform.rotation);
                tmpMark.transform.forward = -Vector3.up;
                marked = true;
            }
            
            else
            {
                tmpMark.transform.position = lockTarget.transform.position + new Vector3(0, 2.5f, 0);
                //tmpMark.transform.forward= -transform.up;
                tmpMark.transform.Rotate(Vector3.up *30* Time.fixedDeltaTime,Space.World);
            }
        }
	}

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.F))
        {
            LockTarget();
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可直接使用的unity第三人称自由视角相机脚本 的相关文章

  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 医院绩效核算系统源码,java语言开发

    医院绩效考核系统全套源码 医院绩效核算系统源码 java语言开发 医院绩效考核系统可根据工作绩效考核管理规定 配置相应的绩效考核模型 从工作量统计 核算维度 核算权重三方面计算工作绩效 利用数据处理和数据分析的支撑作用 实现对工作量统计和绩
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 将指定文件夹中的图片文件复制到另一个文件夹,并按照自然数递增的命名规则重命名的程序

    文件目录结构 C data photos 1 2 3 4 5 6 7 8 photos new 1 2 3 4 5 6 7
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • QT解析XML的三种方式

    1 QT QXmlStreamReader用法小结 解析常用到的函数含义 1 导入一个xml文件或字符串的方式 方式一 QXmlStreamReader reader sXMLContent 字符串的xml 方式二 QXmlStreamRe
  • 自然连接(NATURAL JOIN)

    自然连接 NATURAL JOIN 是一种特殊的等值连接 将表中具有相同名称的列自动进行匹配 1 自然连接不必指定任何连接条件 SQL gt desc emp Name Null Type EMPNO NOT NULL NUMBER 4 E
  • 城市配电网恢复方法

    城市配电网恢复方法是指在大停电事故后 配网与主网断开连接 只能协同利用配网中的分布式电源进行恢复供电的方法 该方法需要考虑多时段 多类型负荷的恢复需求 以及电网 水网 气网的运行约束和发电资源的有限能量约束 计及关键负荷功能恢复需求的多时段
  • 【考研复习:数据结构】查找(不含代码篇)

    前言 1 此篇是基于博主对严蔚敏版教材 数据结构 王道书 数据结构 和在网上相关资料的查询 对第七章 查找 的学习总结 2 查找这一章含代码 C 会写在另一篇 写好后再放链接 3 博主比较喜欢用表格使思路稍微清晰一些 还有一些博主自己怕记乱
  • 找二叉树的中序后继

    设计一个算法 找出二叉搜索树中指定节点的 下一个 节点 也即中序后继 如果指定节点没有对应的 下一个 节点 则返回null 方法一 Definition for a binary tree node public class TreeNod
  • 基于RocketMQ分布式事务 - 完整示例

    前言 之前我们说到 分布式事务是一个复杂的技术问题 没有通用的解决方案 也缺乏简单高效的手段 不过 如果我们的系统不追求强一致性 那么最常用的还是最终一致性方案 今天 我们就基于 RocketMQ来实现消息最终一致性方案的分布式事务 本文代
  • 近期 AI 领域,招聘招生信息汇总

    关注公众号 获取更多AI领域发展机会 本文汇总近期招聘信息 有全职也有实习还有升学机会 有需要的朋友欢迎点击查看详情 投递简历 1 海内外招聘 实习生岗位 同方威视南京研发中心招聘图像算法工程师 北上深 商汤招聘智能视频和数字人算法研究员
  • 初识C语言:一篇文章解决基础的操作符(前置++与后置++的区别)

    目录 一 算术操作符 二 关系操作符 三 赋值操作符 四 自增 自减操作符 前言 总结 前言 1 加法运算符 加法运算符为双目运算符 即应有两个量参与加法运算 右结合性 2 减法运算符 减法运算符为双目运算符 但 也可作负值运算符 此时为单
  • ARM寻址方式

    所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式 ARM处理器的寻址方式 目前ARM处理器支持9种寻址方式 分别是立即数寻址 寄存器寻址 寄存器偏移寻址 寄存器间接寻址 基址变址寻址 多寄存器寻址 相对寻址 堆栈寻址和块拷
  • 自定义规则 Collections.sort() 对 List 排序

    一 Collections sort 与Arrays sort 的比较 Collections sort 该算法是一个经过修改的合并排序算法 其中 如果低子列表中的最高元素效益高子列表中的最低元素 则忽略合并 此算法可提供保证的N log
  • 工作日记NO.12

    后续工作内容 1 尝试编译WINDOWS工程 2 尝试编译LINUX工程 3 根据LINUX工程尝试编译 编写 emscripten工程 今日完成 1 makefile规则 2 libdwg的makefile in makefile am研
  • 一些常用的第三方框架之Fresco下篇

    Fresco的使用 1 gitHub下载依赖库或者jar包 Anroid Studio可以通过compile方式加载 compile com facebook fresco fresco 0 8 1 2 添加网络权限 uses permis
  • spring cloud(四) Eureka配置Httpbasic验证+Eureka配置详解

    目录 spring cloud 一 从一个简单的springboot服务开始 spring cloud 二 起步 集成Eureka服务发现 spring cloud 三 Eureka高可用性 Feign声明式Rest客户端 spring c
  • C# 线程浅谈(三)

    这篇讲线程锁 lock得概念 什么是锁 为什么用锁 做个栗子 俩个线程同时访问一个int对象 一个线程 一个线程 都1W次 那么这个数 不管怎么样 最后都是0 class TaskDom int count 0 public void St
  • 为什么64位计算机CPU架构叫amd64

    x86 1978 年 6 月 Intel 发布了新款 16 位微处理器 8086 开创了一个全新时代 x86 架构由此诞生 x86 架构指的是特定微处理器执行的计算机语言指令集 定义了芯片的基本使用规则 事实上 8086 处理器发布之初并没
  • OpenCV学习日志_2020.10.26_面向Python的OpenCV入门

    日期 2020 10 26 主题 面向Python的OpenCV入门 内容 在Anaconda上安装配置OpenCV 学习图像处理基本操作 以下为具体代码 import cv2 1 读取静态图像 retval cv2 imread file
  • Dell服务器中Lsiutil命令常见使用

    前言 Dell服务器MegaCli命令只返回Exit Code 0x00问题分析 SAS 6i R的raid信息用MegaCli64命令就获取不到呢 SAS 6 iR 只支持2块硬盘做raid0或者raid1 现在返回去看看MegaCli6
  • NLP(五)命名实体识别(NER)

    本文将会简单介绍自然语言处理 NLP 中的命名实体识别 NER 一 什么是命名实体识别 1 命名实体识别简介 命名实体识别 Named Entity Recognition 简称NER 是信息提取 问答系统 句法分析 机器翻译等应用领域的重
  • 征稿

    我们诚挚地邀请您提交论文参加 ACM MM23 会议上 LGM3A Workshop 主题为 基于大语言模型的多模态研究和应用 LGM3A 2023 the 1st Workshop on Large Generative Models M
  • 可直接使用的unity第三人称自由视角相机脚本

    使用方法 将要控制的角色拖到TargetBody 将相机的焦点拖到CamerPivot 建议CameraPivot是一个放在TargetBody下的子物体 并且位置应该是在TargetBody的头部 注意 此脚本自动忽略 Ignore Ra