2019-08-20 11:20:30 weixin_38744526 阅读数 10713
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16352 人正在学习 去看看 姜雪伟

最近在写论文做毕业设计,真是一个头两个大。写过论文的伙伴一定都懂,头发一撮一撮地掉,好心痛!

我的毕设需要用到树莓派编程然后转接到Unity3D利用多媒体投影显示内容,这中间需要用到网络通信多线程。

查了一些资料,决定选择Python Socket来实现功能。Socket是任何一种计算机网络通讯中最基础的内容,网上也能查到好多Python Socket 套接字编程的指南和教程。

不过,教程太多弄得我眼花缭乱,也没明白Socket通信多线程是咋回事,偶然发现了一个讲Python 多线程的小视频,我觉得讲的超详细,很容易懂,特来分享给大家~

如果你也想知道Python多线程是怎么实现的,跟我一起看看下方视频,听知名技术专家李刚老师对Socket多线程和Python的TCP支持与创建TCP服务端的详细解析,

并发编程+网络编程

李刚老师出版的《疯狂java》体系图书曾得到市场的广泛认可,经过多次再版,并被多家高校选作教材。上方视频来自于李刚老师的在线视频课程《21天通关Python》第八章 并发编程+网络编程

鉴于大家都有学习Python的困惑,今天就给大家推荐一本巨有影响力的Python实战书,上线时间仅2个月,就超越了众多实力派,成京东和当当网上的长期畅销图书,并且收获了3.4W的五星好评。

这本书可谓是笔者独家私藏图书之一了,对我学习Python有着莫大的帮助,在京东上也常常"断货",这次拿出来给大家分享一下,希望能帮到大家。

《21天通关Python》视频课程以畅销图书为教材,由图书作者李刚亲自操刀讲解;上手门槛低,可作为0基础掌握Python教材;书籍+线上复合型学习场景特别适合Python小白学习!

点此查看课程:https://edu.csdn.net/bundled/detail/49?utm_source=jiansuopy58_1
(含图书邮寄+视频教程+社群答疑+导师带队)

笔者跟大家分享一个福利!下单时输入优惠码csdn66,立减20元,券后仅需99元
扫码入Python技术交流群,可免费听技术讲座+领学习资料+视频课免费看
在这里插入图片描述

2019-06-09 11:55:12 qq_28388069 阅读数 17
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16352 人正在学习 去看看 姜雪伟

初识Unity3D

unity3D快捷键:

不改变摄像机视角,只改变场景视角:
鼠标左键:选择物体,长按鼠标左键拖动选择多个物体
鼠标右键:旋转视角
鼠标滚轮:按下拖动视角 = hand tool
向上翻滚视角向前靠近,物体在视野中变大
向下翻滚视角向后远离,物体在视野中缩小
ALT+左键拖动:旋转,效果与右键有差异
ALT+右键拖动:控制视角向前向后,效果与鼠标滚轮翻滚相似
Q:= hand tool,按下左键拖动视角
W:= move tool,拖动物体,左键选择物体后,可对物体进行拖动
E: = rotate tool,旋转物体,左键选中物体后,可对物体进行旋转
R: = scale tool,放大、缩小物体,左键选中物体后,可对物体进行放大、缩小
T : = rect tool,锚点变形,左键选中物体后,可利用锚点对物体进行变形
Y: 综合工具,同时具备W、E、R快捷键的功能
V : 顶点捕捉,适合用于贴合物体。
F : 以选中的目标为中心重新建立场景视角,建立新物体时将以此时的视角中心为中心
Ctrl + D:复制物体,选中目标后按下Ctrl+D,可迅速复制一个与原物体大小相同且完全重叠的新物体
Ctrl + shift + F:将当前视角的属性值赋予选中的目标。

未完待述

2019-11-06 21:02:49 q943520218 阅读数 123
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16352 人正在学习 去看看 姜雪伟

     在3D世界里,物体有位置和姿态信息,位置很好理解,就是在空间中的坐标,有绝对坐标(position,世界坐标)和相对坐标(localPosition,相对于父物体的坐标)。

     姿态就不好理解了,描述的是物体旋转,有三个姿态,偏航,俯仰,翻滚。

     分别是物体按照x,y,z三轴旋转的结果

     旋转在unity3d中用四元数来表示,四元数的一种超复数,由一个实部和3个虚部组成,可以表示物体的旋转

     四元数 =  a+ bi + cj + dk; 满足下面公式:

     i^{2} = j^{2} = k^{2} = i*j*k = -1 

     i^{0} = j^{0} =k ^{0} = 1

    具体可以自补数学

    还有一点旋转是不满足交换律的,例如把一个长方体,先向右旋转90度,再向前旋转90度的结果,与先向前旋转90再向右旋转90度的结果是不一样的。

     说了这么多今天来做些什么呢?

     现在有如下问题:

        卫星在地球表面上绕地球转,卫星是有天线的,他的天线方向总是垂直于地球,不然就没法发送信号给地球,现在已知地球位置和卫星位置,把卫星旋转到合适的角度,卫星天线默认Y轴朝上

       实现如下:

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

public class RotationaSatellite : MonoBehaviour
{
    public Transform _earth;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 v1 = _earth.position - transform.position;
        v1.Normalize();
        Vector3 v2 = transform.up;

        Vector3 vertical_v1_and_v2 = Vector3.Cross(v2, v1);
        vertical_v1_and_v2.Normalize();
        float angle = Vector3.Angle(v2, v1);

        transform.rotation = transform.rotation * Quaternion.AngleAxis(angle, vertical_v1_and_v2) ;

    }
}

     代码如上:

     解释如下:

    1、 这其实是个数学问题,首先物体有一个up方向,就是天线方向,先获取卫星的天线方向向量 即 transform.up

          再根据卫星位置和地球位置计算一个向量,该向量就是天线需要选择到的终点

    2、已知了两个向量A,B,进行归一化

          我们知道两个不重合且方向不相反的向量可以构建一个平面

    3、而通过向量的叉乘可以得到垂直于A、B两条向量的一个向量C,该向量C为旋转轴

         即A向量通过绕C轴向量旋转\Phi度就能到达B向量的位置

    4、下一步就是求需要选择的角度

         通过向量的点乘可以得到角度,在c#中有一个求角度的函数Angle

    5、有了角度和旋转轴,即可构造四元数,把原有rotation * 新构建的四元数即为旋转后的姿态。

    效果如下:

    我们发现,不管卫星如何运动,卫星天线已经于地球表面保存垂直了。

2018-12-06 19:27:21 leanerU 阅读数 164
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16352 人正在学习 去看看 姜雪伟

学习来源:《Unity3D/2D游戏开发从0到1》


文本滑动:主要利用组件Scroll Rect,可在Inspector面板下添加。

建立任意一个image,作为显示的背景图(添加Scroll Rect)。新建一空物体作为承载文本或按键(要显示的)的父物体,设置好相应的宽度高度,这与滑动条的值显示有直接关系。

创建Scrollbar,将其赋值与Scroll Rect 中的Horizontal (Vertical) Scrollbar 中任意,两者也都可以赋值,但要对应相应的滑动条。

背包切换:ToggleGroup 组件

新建一个空物体,其下添加ToggleGroup组件。创建两个Toggle组件,将Toggle(Script)下的Group用含有ToggleGroup组件的物体赋值,这就将两个Toggle设置为同一个Group组下。创建两个image,用于显示。在“On Value Changed”属性下,添加相应要显示的image物体,作为切换的显示界面。可通过Toggle下的 Is On属性 来控制谁先显示以及让背包显示更为真实。

2018-10-28 18:15:25 lagoon_lala 阅读数 12318
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16352 人正在学习 去看看 姜雪伟

目录

基础资料

小球脚本:监听键盘使小球移动

摄像机脚本:关联小球与摄像头(镜头不翻滚)

物体旋转脚本

Debug:

存储计分,并显示Text:

Build

完整项目下载


基础资料

Unity官方教程:

https://unity3d.com/cn/learn/tutorials/projects/roll-ball-tutorial/setting-game?playlist=17141

Unity API

https://docs.unity3d.com/ScriptReference/

API翻译

http://www.ceeger.com/Manual/index.html

左上角scale tool 伸缩,中上部Gizmos取消show grid

为物体添加刚体(Rigidbody)组件(Component)

在物体上Add Component可以一步完成脚本的创建与绑定,但创建的文件会位于Asset根目录

获取、使用input的方法:Update、FixedUpdate

Update:在渲染每帧前被调用(多数)

FixedUpdate:执行有关物理计算前被调用(实现物理效果)

Unity API查看(ctrl+’):有问题,按了之后在浏览器一堆404窗口

 

AddForce:给刚体添加作用力,使之移动(参数-三维向量+作用力模式(ForceMode可省略:加速度、力、脉冲和速度变化))

在脚本中访问刚体组件:在Start方法中, GetComponent<Rigidbody>();返回组件引用

Input.GetAxis ("Horizontal")使用输入轴Returns the value of the virtual axis identified by axisName.

 

Start方法中的代码会在脚本(通常也是游戏)运行时的第一帧被调用

用浮点数值组成三维向量:new Vector3(x,y,z)

创建公共变量可以不打开脚本,在检视窗口直接修改

 

检查页脚、控制台报错

CTRL + ALT +C  注释/不注释该行

小球脚本:监听键盘使小球移动

//PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

	public float speed;

	private Rigidbody rb;

	void Start ()
	{
		rb = GetComponent<Rigidbody>();
	}

	void FixedUpdate ()
	{
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);

		rb.AddForce (movement * speed);
	}
}

第三人称设置:将摄像机绑定在player(若成为游戏对象的子对象后,摄像机根据父对象Transform组件数值进行更改或偏移,在三根轴上旋转,)通过脚本将二者相连,而不是作为子对象,二者间的偏移值是游戏角色与摄像机间的位移(不旋转)

LateUpdate():在update执行完后调用,游戏对象已经完成移动

创建游戏对象的引用(拖拽到参数框)

摄像机脚本:关联小球与摄像头(镜头不翻滚)

//CameraController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour {
	public GameObject player;
	private Vector3 offset;
	// Use this for initialization
	void Start () {
		offset = transform.position - player.transform.position;//得出运行开始的固定偏移
	}
	
	// Update is called once per frame
	void LateUpdate () {
		transform.position = player.transform.position
		+ offset;
	}
}

建立父游戏对象Walls放置所有的墙(Create Empty)

游戏项目可以嵌套别的游戏项目,用空白游戏对象作为层级窗口的目录或者文件夹

新建Object:Cube作为墙体,使用前先重置物体位置。改变长度与游戏区域一致

复制物体Edit-Duplicate

编辑器设为Local模式时运行,小球坐标会翻转

 

游戏对象激活状态复选框(属性框Inspector中,物体名前)

自动旋转脚本:Rotation值

Transform:Translate移动,Rotate旋转(传入旋转方向V3或xyz三个浮点数)

将物体作为预制件prefab:资源格式,包含游戏对象的模板,可用于当前项目的任何场景,预制件更新,所有相应对象随之更新。从层级窗口放到项目文件夹后就成为预制件

物体属性框最上框的Apply,能将属性更改应用到预制件

物体旋转脚本

//Rotator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour {
	// Update is called once per frame
	public float speed;
	void Update () {
		transform.Rotate (new Vector3 (15, 30, 45) * Time.deltaTime*speed);
	}
}

存储计分

在Start中设置私有变量初始值

触碰物体时在OnTriggerEnter方法中,.other.gameObject.CompareTag ( "Pick Up")

UI工具集显示文本Text,父对象Canvas,EventSystems游戏对象。所有UI工具必须是Canvas的子对象才能正常工作

UI组件的Transform使用Rect transform

Anchor定位组件轴心(Shift+Alt选择),posit x y改变文字定位

UI工具集存放在命名空间(namespace)UnityEngine.UI。为countText设置初始值

将Text对象引用拖拽到PlayerController脚本属性框

删除物体gameObject.SetActive (false);

winText没有初始化为空字符串时,可以不显示

 

Collider :Sphere Collider球体碰撞体组件(属性栏右侧链接到组件的参考文档)点击Switch to Script,查看怎样在脚本使用

Collider.OnTriggerEnter检测触碰,实际不会造成物理碰撞。触碰到的触发器引用作为参数返回

 

GameObject:

Destroy(other.GameObject)销毁

Tag用于识别,在Tags and Layers面板创建。CompareTag:将标签值与字符串比较,比用gameObject.tag比较高效

SetActive禁用或激活

 

选中多个物体后,属性框显示共有组件与属性。同时禁用所有Mesh Renderer组件。不允许两个碰撞体重叠,碰撞时检测碰撞体的速度、旋转、形状,是静态还是动态,计算碰撞。动态几何体受影响弹开。

碰撞体变为触发器,允许模型重叠渗透。勾选Box Collider的Is Trigger。

碰撞体OnCollider、触发器OnTrigger

触发器会从地板掉下不发生碰撞,禁用Use Gravity,或Is Kinematic:变为只受脚本控制的刚体,运动学刚体不受物理作用力的影响,但可以播放动画或通过Transform组件移动,适用于像电梯或移动的平台

 

静态碰撞体移动、旋转、缩放时,Unity会重新计算这些静态碰撞体体积,更新缓存数据

动态碰撞体不缓存数据,但预测碰撞体的移动

动态碰撞体:刚体。

静态碰撞体:非刚体

动态(刚体)带重力属性(默认Kinematic属性不打开),且触发器,不被地面托住

 

静态刚体:不移动(墙面、地面)

动态碰撞体:可运动,且有刚体组件

普通刚体:通过作用力移动

Kinematic刚体:通过Transform组件移动

Debug:

确定OnTriggerEnter是否发生。other.gameObject

OnTriggerEnter未发生:球体的Sphere Collider勾选,并且Is Trigger勾选

Tag对象分配的标签属性:在属性栏上部Tag

OnTriggerEnter函数触发的条件:

1、两个物体都必须有碰撞器(Collider)组件;

2、其中一个物体的碰撞器(Collider)的IsTrigger属性必须勾上;(这个属性还会影响物体是否从地面掉下)

3、最重要的一点,其中一个物体必须有刚体(Rigidbody)组件。如果是一个运动的物体去碰撞一个静止的物体,则刚体(Rigidbody)组件必须加在运动的物体上,否则无法触发OnOnTriggerEnter函数。

存储计分,并显示Text:

//PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour {

	public float speed;
	public Text countText;
	public Text winText;

	private Rigidbody rb;
	private int count;

	void Start ()
	{
		rb = GetComponent<Rigidbody>();
		count = 0;
		SetCountText ();
		winText.text = "";
	}

	void FixedUpdate ()
	{
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);

		rb.AddForce (movement * speed);
	}
	void OnTriggerEnter(Collider other) 
	{
//		countText.text = "Trigger ";
//		countText.text = "Object: " + other.gameObject.ToString ();
		if (other.gameObject.CompareTag ( "Pick Up"))
		{
			other.gameObject.SetActive (false);
			count = count + 1;
			SetCountText ();
		}
	}
	void SetCountText ()
	{
		countText.text = "Count: " + count.ToString ();
		if (count >= 12)
		{
			winText.text = "You Win!";
		}
	}
}

Build

Building、build target构建与构建目标

Build setting

更改构建目标后,Switch Platform

Add Current或拖拽场景到空白区,添加场景。不添加,会自动用当前编辑的窗口

保存Build文件的Build文件夹应存在项目根文件夹下,与Assets、Library同级。命名文件,save,生成.exe与data文件夹,可直接运行。

完整项目下载

https://download.csdn.net/download/lagoon_lala/10790635

没有更多推荐了,返回首页