查看: 3815|回复: 4

[Unity] 请教碰撞点的法线向量长度问题

[复制链接]
梦石
0
星屑
14310
在线时间
2609 小时
注册时间
2013-6-10
回帖
1690
发表于 2022-8-20 19:35:22 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
不知是否有高手知道。。。代码我贴到最后了。
今日我在学习unity的书时,跟着走到了实现角色移动的步骤,其中涉及到了主角是否站在地面上的检测。以下是各碰撞盒的体积及分布情况(就是那个浅浅的绿绿的框)。这两张图的左下角把法线向量长度打印了出来。
可以看到,与地面垂直碰撞法线长度是1,与地面和障碍物碰撞法线长度变成0.22,我就想问,为什么?
为什么与地面垂直碰撞法线长度是1,为什么与地面和障碍物碰撞法线长度变成0.22?
2.jpg

3.jpg

其中,角色的碰撞盒半径0.5。
1.jpg
我开始想会不会和主角圆形碰撞盒的半径有关系啊?但是半径怎么修改法线长度还是1!
我实在无法理解这个法线向量是怎么回事,无法想象这个法线向量的位置是从那里开始到那里结束的。

以下是我的Player代码,是很常规的实现,对unity比较熟练的人来说应该不难阅读。
[pre lang="ruby"]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Transform playerTransform;
    private Rigidbody2D body;
    public float speed= 2f;
    private bool onGround;
    public float jumpPower = 150;
    // Start is called before the first frame update
    void Start()
    {
        body = GetComponent<Rigidbody2D>();
        onGround = false;
    }

    // Update is called once per frame
    private void FixedUpdate()
    {
        KeyboardControl();
    }
    //碰撞对象脱离与主角的碰撞时
    private  void OnCollisionExit2D(Collision2D collision)
    {
        onGround = false;
    }
    //碰撞对象与主角碰撞并保持接触时
    private void OnCollisionStay2D(Collision2D collision)
    {
        int cnum = collision.contactCount;//获得碰撞点数量
        for(int i = 0;i<cnum;i++){
            ContactPoint2D contact = collision.GetContact(i);
            Debug.Log(contact.normal.y);//前两张图左下角显示了法线向量长度的结果
            if(contact.normal.y > 0.8f){
                if(!onGround){
                    onGround  = true;
                }
            }
        }
    }

    private void KeyboardControl(){
        float sp = speed * Input.GetAxis("Horizontal");
        body.velocity = new Vector2(sp,body.velocity.y);
        if(onGround){
            if(Input.GetAxis("Vertical")> 0.0f)
            {body.AddForce(new Vector2(0.0f,jumpPower));}
        }
    }
}[/pre]
梦石
9
星屑
6256
在线时间
852 小时
注册时间
2017-5-18
回帖
229

极短22获奖

发表于 2022-8-22 02:41:52 | 显示全部楼层
本帖最后由 zeniusi193 于 2022-8-22 03:23 编辑

翻这问题串可以解决大部份Unity内关於这块的问题
https://forum.unity.com/threads/ ... l-inaccurate.77025/

之后关於normal法线

首先你这里,如果在档杆边上,应该是同时print了1.0和0.22,而你因为只有一行只显示了0.22。。。

然后
Normal 法线是个3维数值
(虽然2d可以闭眼不看其中一个数字)
代表一个面向,如果没有特定一个基准
就是按世界xyz轴来算
每一个平行於xyz轴的线都是(1/0/0)(0/1/0)这类的数字
所以你这个和地面的碰撞就会是1.0
(如果另外定基准就是按那个基准来算,详细可以找一下3D法线和法线贴图的概念了解一下)

你人物面向障碍物不是平行於xyz上
那自然会是一个类似(0/0.22***/0.*****)的东西
把xyz全print 出来
再把你地面各种转一下角度看看碰撞结果就知道了

Normal可以跟角度转换
查一下转换公式会更好理解
(我忘了是sin还是cos还是tan~~~~~

后面做按斜率改变材质之类的东西
(比如草地及墙壁,下雨在材质上是会积水还是有流水)
normal 这块就很重要,可以多花时间看看

点评

原来如此!太感谢了!!  发表于 2022-8-22 10:29

评分

参与人数 2星屑 +100 梦石 +1 赞 +2 收起 理由
死伤殆尽 + 100 + 1 + 1 认可答案
小怪兽奇奇侠 + 1 认可答案 + 精品文章

查看全部评分

回复

使用道具 举报

梦石
0
星屑
14310
在线时间
2609 小时
注册时间
2013-6-10
回帖
1690
 楼主| 发表于 2022-9-14 00:55:15 | 显示全部楼层
@tuxyin 我才知道原来这是你写的书
回复

使用道具 举报

梦石
0
星屑
1282
在线时间
257 小时
注册时间
2021-2-16
回帖
229
发表于 2022-10-28 19:24:03 | 显示全部楼层
本帖最后由 tuxyin 于 2022-10-28 19:37 编辑
小怪兽奇奇侠 发表于 2022-9-14 00:55
@tuxyin 我才知道原来这是你写的书


感谢小怪兽购买支持!现在回过头看,书写的其实挺……那啥的 ……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部