3D游戏编程——空间与运动

2023-11-16

3D游戏编程——空间与运动

1、简答并用程序验证

  • 游戏对象运动的本质是什么?

答: 游戏对象运动的本质就是使用矩阵变换(平移、旋转、缩放)改变游戏对象的空间属性。我们做的游戏关键就是游戏对象在每一帧图像上怎么变换。最直观的就是观察我们每个对象的Transform,里面的Position、Rotation以及Scale就是最直接控制我们对象的参数。而游戏对象运动的本质在某种程度上也可以看成是这些参数的变换。

  • 请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)

答:

方法1:

public float yspeed = 10;
public float xspeed = 20;
void Update()
{
    float ymove= yspeed * Time.deltaTime + 1 / 2 * (-1) * Time.deltaTime * Time.deltaTime;
    this.transform.position += Vector3.up * ymove;
    float xmove = xspeed * Time.deltaTime;
    Debug.Log(xspeed);
    Debug.Log(yspeed);
    this.transform.position += Vector3.left * xmove;
    yspeed -= 1;

}

方法2:

public float yspeed = 10;
public float xspeed = 20;
void Update()
{
    Vector3 move = new Vector3((-1)*Time.deltaTime * xspeed, yspeed * Time.deltaTime + 1 / 2 * (-1) * Time.deltaTime * Time.deltaTime, 0);
    this.transform.position += move;
    yspeed -= 1;
}

方法3:

public float yspeed = 10;
public float xspeed = 20;
void Update()
{
    Vector3 move = new Vector3((-1) * Time.deltaTime * xspeed, yspeed * Time.deltaTime + 1 / 2 * (-1) * Time.deltaTime * Time.deltaTime, 0);
    this.transform.Translate(move);
    yspeed -= 1;
}
  • 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。

    行星脚本:

    public float speed;
    public float yangle, zangle;
    void Update()
    {
        Vector3 axis = new Vector3(0, yangle, zangle);
        this.transform.RotateAround(new Vector3(0, 0, 0), axis, speed * Time.deltaTime);
        this.transform.Rotate(Vector3.up * 100 * Time.deltaTime);
    }
    

    使用不同的yangle和zangle设定公转的轴方向,使得行星公转不在同一法平面

    卫星脚本:

    public Transform earth;
    void Update()
    {
        this.transform.RotateAround(earth.position, Vector3.up, 10000 * Time.deltaTime);
        this.transform.Rotate(Vector3.up * 100 * Time.deltaTime);
    }
    

    月球直接设置绕地球转即可,但是公转速度要设大一些,否则可能绕不回来。

2、编程实践

  • 阅读以下游戏脚本

Priests and Devils

Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the river. They all want to get to the other side of this river, but there is only one boat and this boat can only carry two persons each time. And there must be one person steering the boat from one side to the other side. In the flash game, you can click on them to move them and click the go button to move the boat to the other direction. If the priests are out numbered by the devils on either side of the river, they get killed and the game is over. You can try it in many > ways. Keep all priests alive! Good luck!

事物:

在这里插入图片描述

Devil: 恶魔,游戏主体,当数量大于牧师时判定为游戏失败。

Priest: 牧师,游戏主体,当数量小于恶魔时,判定为游戏失败。

Directional Light: 光照源,为所有Object提供光照。

leftShore: 左边的海岸,恶魔与牧师的起始海岸。

rightShore: 右边的海岸,恶魔与牧师的终止海岸。

ship: 牧师与恶魔用以过海的工具。

规则表:

  • 点击 恶魔牧师 可控制其上船、下船。
  • 点击 开船 按钮可以使ship移向对岸
  • 点击 重新开始 按钮可以重新开始游戏
  • 倒计时 时间到后,游戏失败,返回开始菜单

MVC结构:

Model: 在Model中,我设计了Ship、Person、Shore类,定义了其中的方法以及成员变量。

Ship:

  • moveLeft():控制小船左移

  • moveRight():控制小船右移

Person:

  • leftdown():控制恶魔或牧师在左边上船
  • leftup():控制恶魔或牧师在左边上岸
  • rightdown():控制恶魔或牧师右边上船
  • rightup():控制恶魔或牧师右边上岸

Shore类只有简单的构造函数,加载预设,这里不赘述了

View: 在View中,设计了几个按钮,及其触发的事件。通过告知Controller来做更多的计算。

Update:

在Update中设计了船的移动,通过transform和Vector3的变换,对ship和其中的成员变量Arraylist Passengers来控制船和恶魔、牧师的移动。

OnGui:

在OnGUi中设计了 开船 按钮和 重新开始 按钮,使用Application.LoadLevel(0)来重置游戏。并设计了获胜和落败的文字显示。

Controller: 在Controller中,用了单例模式来控制游戏的进行。其中包括了船的移动方向,人的移动方向及游戏结束与否判断等方法。

loadResource: 加载预设,创建游戏中的各个Object

ship_move: 控制船的移动

judge: 判断游戏结束与否,胜负条件

person_move: 控制恶魔与牧师的移动

其他脚本

welcome.cs: 这是第一场景,也就是开始菜单的脚本,里面包含了规则的介绍,以及一个开始按钮。

mytime.cs: 这个脚本使用了 协程 来做这个游戏的计时器。以下是其关键代码:

void Start()
{
    StartCoroutine(startTime());   
}

public IEnumerator startTime()
{

    while (TotalTime >= 0)
    {
        yield return new WaitForSeconds(1);
        TotalTime--;

    }
}

3. 思考题

实现RotateAround,代码如下:

void RotateAround(Transform t, Vector3 center, Vector3 axis, float angle)
{
var position = t.position;
var rot = Quaternion.AngleAxis(angle, axis);
var direction = position - center;
direction = rot * direction;
t.position = center + direction;
t.rotation *= rot;
}

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

3D游戏编程——空间与运动 的相关文章

  • 【问题记录】python 命令行启动 http server 在局域网内从浏览器下载

    一 安装 python 要确保本机或服务器安装 python 二 查看本机 服务器的 ip 地址 命令 ifconfig 可以查找 ipv4z 字段 例如 172 16 0 12 如果是服务器起的话 就不用查看 ip 了 直接就是服务器 i
  • 华为云存储空间图库占比太大_华为手机照片太多?放这里既安全又不占内存,瞬间腾出50G空间...

    现在的手机拍照功能越来越强大 很多人都习惯在旅游出行 聚餐吃饭时用手机拍照记录自己的生活 久而久之手机相册就存储了一大堆图片 占用大量的手机内存 怎么办呢 通常的做法就是定期删减一些不必要的图片 但是这样太麻烦了 有没有方法可以将这些手机照
  • maven环境变量配置,总不成功,你就这样试试

    我下载了maven 解压后的目录为 配置了用户变量为下图 然后配置系统的path变量如下图 配置完后我也重启了系统 但是还是显示为下图 这是怎么回事 我进入 bin 下执行命令就没问题 说明程序好好的 但是这个怎么就是不成功呢 分享到 举报
  • 实例分割之SOLOv2: Dynamic, Faster and Stronger

    论文 代码 SOLOv2为作者对SOLO的改进 采用动态卷积核生成实例掩码 若对SOLO不了解 可先戳这里 作者取名为Dynamic head 将SOLO中的Mask Branch改为kernel branch和feature branch
  • ubuntu下nfs服务安装

    操作系统 ubuntu22 04 2 一 服务端安装与配置 1 在服务端安装nfs服务端组件 sudo apt install nfs kernel server 2 创建共享目录share并且授权所有人可以访问 sudo mkdir sh
  • 物联网全栈教程-从云端到设备(一)

    一 2016年的时候 我还在学校里面准备着毕业论文 当时做的课题是预测一个挖掘机上面的一个继电器的寿命 我们的想法是检测其吸合的次数 然后根据吸合的次数来预计其寿命 这个想法很简单 因为一个继电器失效之前通常会正常吸合一定的次数比如10W次
  • 【错误】IDEA :Windows找不到文件“chrome”。请确定文件名是否正确,再试一次

    idea运行前端页面的时候 遇到错误找不到浏览器位置 首先确认的就是地址没找到 那么需要我们手动添加一下 找到浏览器 查看属性复制它的全路径 在回到idea中然后在IDEA里面 File gt setting gt Web Browsers
  • EMC整改小技巧

    EMC整改小技巧 差模干扰与共模干扰 差模干扰 存在于L N线之间 电流从L进入 流过整流二极管正极 再流经负载 通过热地 到整流二极管 再回到N 在这条通路上 有高速开关的大功率器件 有反向恢复时间极短的二极管 这些器件产生的高频干扰 都
  • 浏览器会因为什么样的脚本而崩溃

    浏览器可能因为以下几种情况而崩溃 无限循环 如果JavaScript脚本包含一个无限循环 浏览器将无法停止脚本的执行 导致浏览器不响应甚至崩溃 例如 以下代码会导致无限循环 while true 无限循环 内存泄漏 如果JavaScript
  • Java关键字--------final关键字

    final关键字 final关键字表示最终的 不可修改的 final关键字可以用来修饰类 方法和属性 1 final关键字修饰属性 被final关键字修饰的属性的值和类型都不能再改变 就属于常量 只能做一次赋值 被final修饰的属性通常与
  • 【XINLIX 原语】XILINX 原语的使用之 IBUFDS 差分转单端、OBUFDS 单端转差分

    目录 IBUFGDS IBUFDS 介绍 IBUFDS 示意图 例化方式 OBUFDS OBUFDS 介绍 OBUFDS 示意图 例化方式 在 XILINX 中有许多原语 常见的差分转单端 IBUFDS 单端转差分 OBUFDS IBUFG
  • SO_LINGER选项

    SO LINGER选项 SO LINGER选项用于控制close系统调用在关闭TCP连接时的行为 默认情况下 当我们使用close系统调用来关闭一个socket时 close将立即返回 TCP模块负责把该socket对应的TCP发送缓冲区中
  • 代理IP与网络安全在跨境电商中的关键作用

    跨境电商已成为全球商业的重要组成部分 然而 随之而来的网络安全问题也日益凸显 为了在海外市场取得成功 不仅需要优质的商品和服务 还需要稳定 安全的网络连接 本文将介绍如何运用Socks5代理IP技术解决这些挑战 1 代理IP与网络安全 网络
  • [技术讨论]PT100采样电路设计

    本来不论PT100还是PT1000 他们的采样电路网上都很多 而且之前直接用的是现成的MAX31865方案 奈何领导说太贵 用集成运放搭吧 领导动动嘴 属下跑断腿 于是各方论坛 度娘 终于整了个有希望的方案 仅以此文记述这段硬件方案设计的经
  • MySQL 中的 SET 与 ENUM 类型使用详解

    一 SET类型 在创建表时 就指定SET类型的取值范围 sql view plain copy 属性名 SET 值1 值2 值3 值n 其中 属性名 参数指字段的名称 值n 参数表示列表中的第n个值 这些值末尾的空格将会被系统直接删除 其基

随机推荐

  • IRET指令详解

    copy from http lion3875 blog 51cto com 2911026 532347 当使用IRET指令返回到相同保护级别的任务时 IRET会从堆栈弹出代码段选择子及指令指针分别到CS与IP寄存器 并弹出标志寄存器内容
  • alert获取输入框内容_js弹出输入框并且获取输入值

    prompt 方法用于与用户交互 提示用户输入信息的对话框 首先 看看prompt方法的语法形式 var val prompt str1 str2 以上代码中 此方法包含两个属性 str1 提示用户输入的信息 str2 用户输入文本信息默认
  • OpenAI最新官方ChatGPT聊天插件接口《插件示例demo》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(四)(附源码)

    Example plugins 插件示例demo 前言 Introduction 导言 Learn how to build a simple todo list plugin with no auth 了解如何构建一个简单的待办事项列表插
  • 钉钉机器人接收阿里云物联网平台转发的数据

    开篇先献上效果图 现在钉钉已经成为跟微信一样流行的APP了 社交端微信占了 企业端现在的老大应该是非钉钉莫属了 现在用户数量应该已经超过4亿了吧 疫情期间钉钉可是真火了一把 好了 下面进入正题 1 数据获取 首先数据的来源是接入到阿里物联网
  • 背景差分法示例

    背景差分法 背景差分法是一种很常用而且广泛传感的技术 主要用于背景不动的情况下提取前景 它主要的原理是在当前帧和背景做减法 然后使用threshold进行二值化得到前景掩码 下面是背景减法的示意图 背景差分法主要包含以下两个步骤 1 背景的
  • 如何触发‘isTrusted = true‘点击事件

    前言 isTrusted是DOM属性 只能可读 如果事件是由用户调用的 则该事件是可信的 如果是由脚本调用的 则该事件是不可信的 总的来说就是 如果你是通过正常浏览器方式进行操作 基本无法改变该属性 解决方法 1 使用python的sele
  • Ubuntu16.04安装搜狗输入法 详细教程

    由于自己也是一个刚入门Ubuntu的新手 对很多终端命令 软件的安装都不大了解 这里记录一下Linux版本的搜狗输入法 一开始觉着有个中文版的系统自带的输入法挺好的 结果没有想到拼音确实不是很好用 就根据这篇教程安装好了Linux版本的搜狗
  • Faster RCNN详解

    paper Faster R CNN Towards Real Time Object Detection with Region Proposal Networks Tensorflow faster r cnn github Tenso
  • VUE经典面试题

    vue2 0的实现原理 vue数据双向绑定是通过数据劫持结合发布者订阅模式来实现的 也就是说数据层和视图层同步 数据层发生变化 视图跟着变化 视图变化数据也跟着随之发生变化 第一步 需要observe的数据对象进行递归遍历 第二步 comp
  • mysql 触发器

    触发器 当对某张表进行 INSERT DELETE UPDATE 操作时 会自动触发定义的触发器中的操作 顾名思义 当我们为某张表定义触发器后 向表中添加 删除 修改数据时 会触发触发器中定义的操作 触发器像是一个事件的监听 一旦监听的事件
  • springboot校园二手物品交易平台 毕业设计源码03373

    目 录 摘要 1 绪论 1 1 研究背景 1 2国内外研究现状 1 3论文结构与章节安排 2平台分析 2 1 可行性分析 2 2 系统流程分析 2 2 1 数据流程 3 3 2 业务流程 2 3 系统功能分析 2 3 1 功能性分析 2 3
  • 大数据标准化白皮书(2020版) 附下载地址

    大数据是新时代最重要的 数字金矿 是全球数字经济发展的核心动能 数据资源如同农业时代的土地 劳动力 工业时代的技术 资本 已经成为信息 时代重要的基础性战略资源和关键生产要素 是推动经济发展质量变革 效率变 革 动力变革的新引擎 不断驱动人
  • python爬取推特图片_twitter图片视频批量下载

    import requests import re from urllib request import urlretrieve import os import ssl ssl create default https context s
  • 试看5分钟视频python_Python面试应急5分钟!

    不论你是初入江湖 还是江湖老手 只要你想给自己一个定位那就少不了面试 面试的重要性相信大家都知道把 这就是我们常说的 第一印象 给大家说一下我的面试心得把 面试前的紧张是要的 因为这能让你充分准备 面试时的紧张是绝对要避开的 因为这可能导致
  • open source 3d map_3D视觉技术在机器人抓取作业中的应用实例

    原标题 3D视觉技术在机器人抓取作业中的应用实例 关键词 3D视觉 工业机器人 抓取 1 引言 3D视觉技术作为新兴的技术领域还存在很多亟待解决的问题 但2D视觉已不能满足空间抓取的应用要求 与2D视觉相比 3D视觉技术的优点有 1 3D视
  • C++ 创建桌面快捷方式

    include
  • 白盒测试——基本路径测试

    基本路径测试是将程序流程图转化为控制流图 通过分析控制结构的环路复杂性 进而找出路径的基本独立集 最终导出测试用例 基本独立集 从基本独立集导出的测试用例保证对程序中的每一条语句至少执行一次 控制流图 定义 百度百科 是一个过程或程序的抽象
  • 若依开关使用

  • OpenLayers 6加载各种地图源的方法(天地图、百度、高德、ArcGIS、Bing、OSM、Google等)

    前言 OpenLayers是一个用于开发WebGIS客户端的JavaScript包 OpenLayers 支持多种常用的地图来源 包括天地图 百度地图 高德地图 ArcGIS地图 Bing地图 OSM地图 Google地图等 一 加载天地图
  • 3D游戏编程——空间与运动

    3D游戏编程 空间与运动 1 简答并用程序验证 游戏对象运动的本质是什么 答 游戏对象运动的本质就是使用矩阵变换 平移 旋转 缩放 改变游戏对象的空间属性 我们做的游戏关键就是游戏对象在每一帧图像上怎么变换 最直观的就是观察我们每个对象的T