Unity屏幕分辨率调整导致UI消失的原因

在我交付的第一版DEMO中,出现了一个奇怪的问题,在屏幕分辨率横纵比很高的时候(横屏比较宽),我的确定按钮会消失不见,但是我的编辑器上能看到UI实体并没有消失。网上查阅了资料也没理解为什么会出现这种情况,在我的摸索中我发现了我的Canvas选择了随屏幕大小缩放,然后我测试了free Aspect,才发现这一问题:UI的缩放超出了极限,导致横/纵向变成了零。于是我修改了匹配规则,将宽高比设置为了1,这样我们的UI在屏幕缩放的过程中就不会出现横纵发生变化的情况了。而UI过度的形变导致了我们的UI消失。

另外在调试UI的时候,可以勾选显示覆盖选项:

这样我们就可以编辑到我们实际渲染时候看到的东西了。

2024浙江省青少年定向锦标赛

2024浙江省青少年定向锦标赛

杭州电子科技大学定向越野队,经历了长达五年的大低谷。19、20、21、22、23。整整五年没有任何省级及以上的比赛。

疫情对定向运动的是毁灭性的。19、20、21和22年春天,都是在疫情爆发或封锁阶段。任何户外比赛都不可能举办,随着比赛消失的还有队员的训练、队员的实力、比赛的评级。

当22年秋天,疫情解封时,杭电也迎来了一场定向校赛。可惜的是没有任何一名新队员接触过定向比赛,但是金益群队长并没有放弃,每周训练,从未无故停训。

没有任何参赛经验是非常可怕的事情,以至于到了23年金队长退役之后新上任的张慧源队长不知道如何给队员训练。体能训练是23级队员练的最多的东西。

因为没有比赛,杭电体育部也取消定向队的训练津贴。好在我们撑过来了,24年是神奇的一年,我们引来了两位希望之光——吴梓霆和曹舒茗。

吴梓霆是越野好手,方向感极强,路跑半马大众精英运动员、曹舒茗从小参加定向越野比赛,曾获2019杭州市中学生定向赛积分女子甲组第六、2020杭州市中学生定向赛积分女子甲组第一、2020杭州市中学生定向赛百米第六、2020年省赛M16短距第三、2021杭州市中学生定向赛积分女子甲组第八。

张队和祝队商量过后,向朱老师提出了参加本次省赛的决定。列出一个节俭的预算表后,朱老师向体育部发去了申请。可惜被驳回了,给出的理由是本次比赛没有教育局的参与。

但是我们没有放弃,打算自费参加本次比赛。这时朱老师站了出来,帮我们扫平了前方的障碍:为我们支付了比赛的报名费和路费,为我们打通了体育部的参赛许可。接下来便是体检、盖章、保险、承诺书以及————比赛!

为了节省预算,我们没有报名第一天的接力赛(需要三个同组别的选手),两名队员第一天到达,参加了领队会议和第二天的百米赛。两名队员第二天到达,参加第三天的短距比赛,最后一名队员第三天到达,直奔赛场参加比赛。最后大家一起参加中距/积分赛。

第二天的百米赛,曹舒茗同学开门大吉,拿到了W21组百米赛的第七名;第三天吴锶梦同学拿下W21组短距赛的第六名;第四天吴梓霆同学拿下了M21组中距赛的第三名!曹舒茗同学拿下了W21组积分赛的第二名!吴锶梦同学拿下W21组积分赛的第四名!

这次比赛,我们背水一战、这场比赛,我们孤注一掷、这场比赛,我们决定生死!

定向队!活下来了!

曹舒茗W21组积分赛第二名

曹舒茗W21组百米赛第七名

吴锶梦W21组积分赛第四名

吴锶梦W21组短距赛第六名

吴梓霆M21组中距赛第三名

Unity如何设置鼠标图标?

我们要设置鼠标图标,肯定是因为要在不同的条件下能呈现不同的图标,所以我们需要一个单例来暴露设置鼠标的接口。

你可以从Assets · Kenney上下载一些免费资源来学习。 我们要找到已经拆分好的Tiles,将他们的格式设置为icon,并调整它的最大大小,最好设置为32,因为我们的指针不会很大,太大了会导致显示奇怪。

然后我们需要知道指针图标的全局控制方法:

指针的控制方法

unity为我们提供了一个简单易用的api来控制指针图标:

cursor api
1
Cursor.SetCursor(cursorTexture, hotspot, mode);

它接受三个参数,用于设置指针的图标、控制点、控制方式。hotspot我们会设置为(0,0),mode设置为CursorMode.mode,然后再根据状态设置texture就可以了。

使用求交判断鼠标指向什么

我们要判断鼠标处于什么状态可以使用光线投射来判断与什么求交。简单的,我们如果要判断与实体求交的话只需要使用,Physics2D.Raycast就可以得到第一个与光线相交的物体,但是如果我们的场景中存在不可见的覆盖物的时候,就可能出现指针状态不正确的情况。

1
RaycastHit2D hit = Physics2D.Raycast(clickPos, Vector2.zero);

并且这种方式无法判断是否与UI(canvas render)相交,所以我们需要使用到Evensystem的接口来获取所有的相交物了。

1
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);


该函数会返回场景中所有与指针相交的物体,并排序。所以我们只需要得到该物体后使用第一个符合我们规则的物体作为我们的相交物体就行了。(这里需要注意,如果只选择第一个物体作为我们的相交物体可能出现被意想不到的物体遮挡的情况)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
foreach (var hit in results)
{
    if (hit.gameObject != null)
    {
        Debug.Log("[CursorManager] Hit the obj: " + hit.gameObject.name + " tag with: " + hit.gameObject.tag);
        if (hit.gameObject.CompareTag("Enemy"))
        {
            SetCursor(CursorType.Attack);
            return;
        }
        else if (hit.gameObject.CompareTag("ground"))
        {
            SetCursor(CursorType.Walk);
            return;
        }
        else if (hit.gameObject.CompareTag("Buttom") || hit.gameObject.CompareTag("Inter"))
        {
            SetCursor(CursorType.Inter);
            return;
        }
// more Type of Cursor
    }
}
SetCursor(CursorType.Normal);

2024第一届下沙十英里接力赛后记

第一届下沙高校十英里比赛

于2024-11-20日下午4:45在浙江理工大学北田径场举行。活动顺利结束,本次活动共有8支队伍参加了比赛,最终评出了两支得奖队伍,一名区间最速奖。

比赛文件

比赛文件.pdf
比赛文件.docx

最终成绩公示

冠军队伍

队名:随便顺一下队

队员:

陈景菲(女)

陈景菲,浙江理工大学23级本科生。

  • 17:53.24
陈祺瑶

陈祺瑶,浙江理工大学23级本科生。

  • 15:11.3
王康康

王康康,浙江理工大学22级本科生。

  • 13:53.63
金佳炜

金佳炜,浙江理工大学22级研究生。

  • 13:01.27

总成绩(结算后):56:00

亚军队伍

队名:“诚信四分配”队

队员:

吴梓霆

吴梓霆,杭州电子科技大学24级圣光机学院本科生。

  • 14:05.16
李承浩

李承浩,杭州电子科技大学23级自动化学院本科生。

  • 14:30.39
刘志

刘志,杭州电子科技大学24级理学院本科生。

  • 14:06.41
陈位恺

陈位恺,杭州电子科技大学24级自动化学院本科生。

  • 13:57.73

总成绩(结算后):56:39

区间最速

金佳炜

最终成绩:13:01.27

马原实践汇报

由于我被小组分到了一个汇报者的位置,但是看到组员写的PPT实在是没办法上去汇报,于是我准备自己重新写一份PPT上去汇报。

马原其实我还蛮喜欢的,各种理念很有逻辑性,不会假大空,需要感受,而不是空想。

我打算从小米的成功逻辑来分析,抽离其中的马克思主义原理,并分析我们大学生应该如何学习它。

  • 社会公正与公平竞争
    • 马克思主义强调社会公平正义和社会责任。小米公司在发展过程中也注重履行企业社会责任,例如通过提供性价比高的产品来服务广大消费者群体,尤其是在中国及全球范围内推动了智能手机的普及。
      • 小米通过其“互联网+”模式降低了手机和其他智能设备的价格,使得更多普通人能够负担得起高质量的产品。这在一定程度上体现了减少消费者被剥削的理念。
    • 在市场竞争中,小米倡导公平竞争和透明化操作,努力营造一个健康、公正的市场环境。

Unity如何控制场景切换后角色的位置?

在创作场景切换功能的时候,我遇到了一个问题,我的角色是不随场景切换而销毁的,而切换场景的时候需要确定角色的落点,但是场景切换是一个异步的过程,我们需要在这个协程结束之后再执行角色移动的代码。

在此之前,我在网上查阅了许多教程,有的说用角色的Start函数来追踪场景中的固定物体,【Unity3D游戏项目入门教程】49.一行代码搞定切换场景后角色的位置。_哔哩哔哩_bilibili但是无法实现良好的操作逻辑,比如我的箱庭场景之间的切换。结合我目前实现的场景加载等待界面,我实现了一个可以定位任意位置的切换场景方式:

场景切换等待界面的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void StartLoading(string scene, Vector2 pos)
{
LoadPanel.SetActive(true);
currentProgress = 0;
targetProgress = 0;
StartCoroutine(LoadingScene(scene, pos));
}
public IEnumerator LoadingScene(string sceneNum, Vector2 pos)
{
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneNum);
asyncOperation.allowSceneActivation = false;
while (asyncOperation.progress < 0.9f)
{
targetProgress = (int)(asyncOperation.progress * 100);
yield return LoadProgress();
}
targetProgress = 100;
yield return LoadProgress();
asyncOperation.allowSceneActivation = true;
yield return new WaitUntil(() => asyncOperation.isDone);
hero.Instance.MoveToScenceCenter(pos);
}
private IEnumerator<WaitForEndOfFrame> LoadProgress()
{
while (currentProgress < targetProgress)
{
++currentProgress;
text.text = currentProgress.ToString() + "%";
bar.fillAmount = currentProgress / 100f;
yield return new WaitForEndOfFrame();
}
if (currentProgress >= 99)
{
LoadPanel.SetActive(false);
}
}

这个协程根据帧率刷新进度,我觉得是不太好的行为,这样至少需要100帧才能完成加载。 可以尝试修改为等待0.01s来更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private IEnumerator LoadProgress()
{
while (currentProgress < targetProgress)
{
++currentProgress;
text.text = currentProgress.ToString() + "%";
bar.fillAmount = currentProgress / 100f;
yield return new WaitForSeconds(0.01f); // 等待0.01秒
}
if (currentProgress >= 99)
{
LoadPanel.SetActive(false);
}
}

我们的核心思想就是将移动角色的代码写入协程中,这样才能保证异步执行不会出错,也就是函数LoadingScene中的

1
2
yield return new WaitUntil(() => asyncOperation.isDone);
hero.Instance.MoveToScenceCenter(pos);

这样就可以是实现一个场景转换后角色能按指定位置移动的方法了。调用也是很方便的。

2024定向队新生选拔赛

说明

杭州电子科技大学定向越野队新生选拔赛预计于2024.11.10(周日)举行,有资格参与选拔的同学为2024新生杯男子组和女子组前八名的同学。此次选拔预计选出四名同学进入定向队,其中至少包含一名女生。

比赛路线

本次比赛使用“九溪十八涧”路线,起点为九溪公交站台,绕路线逆时针一圈结束。途经陈布雷墓、陈三立墓、林海亭、九溪烟树、百世美茗茶园、九泓亭、十里锒铛、西山游步道、瞭望亭、五云山、真际寺……最终回到九溪公交站。全长约10km,总爬升440m左右,该路线运动强度大

比赛规则

所有选手自由选择补给配置,男女同时出发,成绩以运动记录为准。

建议补给与装备为

  • 250ml纯净水
  • 轻便运动服
  • 防滑运动鞋

不建议带太多东西,山脚下有存包的设备,我们尽量为大家配备对讲机。

男生预期完赛时间为90分钟,女生不详。

远程连接与传输

我们的许多设备如服务器、NAS、三层交换机、路由器等,都需要使用远程连接进行控制或配置。最常见的远程连接方式有ssh连接和web服务,而涉及到文件传输时,我们常用到的有scp命令和rsync。今天我们就来缕一缕这写协议与命令的使用方法。涉及到网络,会有很多细小的部分,如果出现与文中描述的不同的情况,请多思考捋清楚自己的网络环境再继续后续操作。

连接

最简单的部分当然是需要连接我们的设备了,在连接之前我们通常会检测与设备的联通状况。对于目标机器为Linux操作系统的,默认是允许进行检测的。

我们打开一个终端,使用ping命令来测试我们的连通性:

1
ping 10.20.1.1

这里我使用windows作为客户机演示了一遍:

windows中,ping命令默认执行四次,但是在Linux中,默认是不断执行的:

注意观察两次的结果,在我的内网环境中10.20.1.1是一台Debian操作系统,而192.168.201.119是一台windows操作系统,我们开可以简单的通过ttl来猜出他们的操作系统。下表是他们的对应关系。

操作系统 默认ttl
Windows 128
Linux 64

在确保回执时间不长后(一般我认为100ms以下是可以接受的ssh延迟。),我们可以开始连接了。首先确保你的两台机器都安装了openssh服务,这一步请STFW。在这一步之前,你需要知道你的目标机器的IP、用户、密码(或者私钥)、开放端口号

我们需要准备

  • IP(或者域名)
  • 用户名
  • 密码(或者私钥)
  • 端口号(默认22)

密码连接

如果你有密码连接的需要,建议不要使用密码连接你的root用户。root用户默认不允许使用密码连接,这很重要。
如果能正确的控制你的权限以及网络公开范围,你可以这样开始允许密码登录:

1
2
3
4
5
6
vim /etc/ssh/sshd_config

33c33
< #PermitRootLogin yes
---
> PermitRootLogin yes

也就是将这一行注释取消,并改为将值改为yes

用户 root
密码 password
IP 10.20.1.1
Port 22

注:本机器不可访问
然后使用下面的命令尝试连接:

1
ssh root@IP -p 22

如果出现让你输入密码的提示,说明连接没问题,密码正确的话就可以连接了。不建议开放密码登录的原因就在于只要密码被盗窃了,那么其他人就能快速提权,掌握你的系统。

密钥连接

私钥连接也是不那么安全的方法,你需要获得机器上的私钥,并使用它来连接机器。这意味着你的私钥一旦丢失,那么他人就能轻松的掌握你的系统。

首先你得获取你用户机上的公钥,使用

1
ssh-keygen -t rsa

生成你的密钥,你可以简单的回车来创建一个没有密码的密钥,然后将id_rsa.pub记录下来,保存在你目标机器的~/.ssh/authorized_keys中,你可以直接使用文本编辑器插入其中,这是最高效的方法。你也可以使用

1
ssh-copy-id -i /path/to/your/pubkey user@ip

这个命令在windows下不一定可行。将你的公钥加入此文件夹后,你就可以无需密码连接该服务器了。

传输

传输介绍两个方法,一个是scp,一个是rsync。其实两个命令都可以基于ssh协议来传输,所以保证前面的连接是通畅的。

scp

scp命令是非常简单的命令,几乎没有多余的话语就能将文件传输到服务器上。
现在我需要将当前目录的test.txt传输的目标机器的/root/下,我可以这么写:

1
2
scp ./test.txt user@ip:/root/
scp user@ip:/root/test.txt .

你发现了,只需要在用户-IP段后面加上路径就行了。

对于一个递归的目录,我们可以使用-r参数来递归地传输:

1
2
scp -r ./test user@ip:/root/
scp -r user@ip:/root/test .

rsync

rsync实际上是一个同步命令,但是我们经常拿它来进行远程传输,并且它支持断点重连等功能非常的好用。
详细的使用方法我推荐rsync 用法教程 - 阮一峰的网络日志,你可以简单的用rsync -avz来代替scp,比如:

1
rsync -avz ./test.txt user@ip:/root/

到此结束~
快去和你的机器连接吧!

NU-NeRF论文解读

Neural Reconstruction of Nested Transparent Objects with Uncontrolled Capture Environment

无控制捕获环境下嵌套透明物体的神经重建
NU-NeRF
参考

Abstract 摘要

The reconstruction of transparent objects is a challenging problem due to the highly noncontinuous and rapidly changing surface color caused by refraction. Existing methods rely on special capture devices, dedicated backgrounds, or ground-truth object masks to provide more priors and reduce the ambiguity of the problem. However, it is hard to apply methods with these special requirements to real-life reconstruction tasks, like scenes captured in the wild using mobile devices. Moreover, these methods can only cope with solid and homogeneous materials, greatly limiting the scope of the application. To solve the problems above, we propose NU-NeRF to reconstruct nested complex transparent objects requiring no dedicated capture environment or additional input. NU-NeRF is built upon a neural signed distance field formulation and leverages neural rendering techniques. It consists of two main stages. In Stage I, the surface color is separated into reflection and refraction. The reflection is decomposed using physically based material and rendering. The refraction is modeled using a single MLP given the refraction and view directions, which is a simple yet effective solution of refraction modeling. This step produces high-fidelity geometry of the outer surface. In stage II, we use explicit ray tracing on the reconstructed outer surface for accurate light transport simulation. The surface reconstruction is executed again inside the outer geometry to obtain any inner surface geometry. In this process, a novel transparent interface formulation is used to cope with different types of transparent surfaces. Experiments conducted on synthetic scenes and real captured scenes show that NU-NeRF is capable of producing better reconstruction results than previous methods and achieves accurate nested surface reconstruction while requiring no dedicated capture environment.
由于折射引起的表面颜色的高度不连续和快速变化,透明物体的重建是一个具有挑战性的问题。现有的方法依赖于特殊的捕获设备,专用的背景,或地面实况对象掩模,以提供更多的先验知识,并减少问题的模糊性。然而,很难将具有这些特殊要求的方法应用于现实生活中的重建任务,例如使用移动的设备在野外捕获的场景。此外,这些方法只能科普固体和均匀的材料,大大限制了应用范围。为了解决上述问题,我们提出了NU-NeRF来重建嵌套的复杂透明对象,不需要专门的捕获环境或额外的输入。NU-NeRF建立在神经符号距离场公式的基础上,并利用神经渲染技术。它包括两个主要阶段。在第一阶段,表面颜色被分为反射和折射。使用基于物理的材质和渲染来分解反射。在给定折射和视角方向的情况下,使用单个MLP来建模折射,这是一种简单而有效的折射建模解决方案。该步骤产生外表面的高保真几何形状。在第二阶段,我们使用显式光线追踪重建的外表面精确的光传输模拟。在外部几何结构内部再次执行表面重建以获得任何内部表面几何结构。在这个过程中,一种新的透明界面配方是用来科普不同类型的透明表面。在合成场景和真实的捕获场景上进行的实验表明,NU-NeRF能够产生比以前的方法更好的重建结果,并且在不需要专用捕获环境的情况下实现精确的嵌套表面重建。

Method 方法

如何绘制一张定向路线图?

首先是物资准备:

  • OCAD软件
  • 定向底图
    这两个请找你的队长获取,或者在这里有一个链接,仅供学习使用:
    OCAD专业版
    这个链接不定时失效。

检查地图比例尺

首先查看自己的底图:

你需要注意的是比例尺,这里我们的地图比例尺是1:4000,我们需要根据这个来创建我们的项目。

创建路线项目

打开我们的OCAD,这个过程会比较缓慢(由于软件比较老了,但是它老而好用),点击File->New File,根据下面的图片找到对应的路线设计制图规范。Course setting project for orienteering -> 4000选择你需要的规范创建项目。

你的项目中应该有这些symbel

我们绘制的图元,都是symbel,通过标签中的symbel控制。

导入底图

找到Background Map -> Open选择你的底图文件,建议将dpi调整到最高,之后导出可以减小,这样可以让最后的地图更加清晰。

绘制点位

起点是一个三角形,找到它点击。

找到地图上你想放置起点的地方,开始绘制。要注意的是,我们的鼠标应该是一个十字(Point object),你可以按住右键选择当前模式,设置为(Point object)模式之后就可以放下点位了。
同样的,绘制好中间点、终点就可以了。

设置路线

首先点击Course Setting -> Courses -> add,创建一个新的路线。

然后回到右侧的Course,选择你创建的路线。

选择一个点位:

右侧添加描述,描述规范可以在这里找到国际检查点说明,设置好后,双击点位,即可将它插入到路线的后面。设置好路线之后像这样:

|