一种游戏细节层次处理方法及系统与流程

文档序号:17932003发布日期:2019-06-15 00:58阅读:466来源:国知局
一种游戏细节层次处理方法及系统与流程

本发明涉及一种游戏细节层次处理方法及系统,属于计算机技术领域。



背景技术:

在当今时代,手机游戏已经成为人们娱乐生活的一个重要部分。

手机游戏通常需要在有限的手机性能的条件下,表现各种优美的游戏效果。

手机的游戏场景也越来也越庞大。表现庞大的场景对于手机有限的硬件性能来说,是一个巨大的挑战。

为了在手机的硬件性能下,尽可能的为玩家渲染庞大的场景,游戏中通常采用lod(levelofdetails-细节层次的技术),现在通常的lod(细节层次)技术是通过判定物体的距离,让过远的物体不显示或显示更少的细节。

但这种依靠距离的方案解决不了虽然距离不远,但是在屏幕中占比很小,依然可以不显示或显示更少细节的物体。



技术实现要素:

为解决上述问题,本发明的目的在于提供一种一种游戏细节层次处理方法及系统,包括读取游戏场景中的物体网格,并根据网格生成对应的包围盒,并获取该包围盒在世界空间中的三维坐标;将该包围盒的世界空间坐标转换为视窗坐标,对横纵坐标进行归一化处理;根据得到的视窗坐标重生成为网格,并根据网格生成对应的包围盒,获取该包围盒在世界空间中的三维坐标;根据三维坐标计算横纵坐标轴占用屏幕的比例,得到比例系数;判断比例系数与阈值的大小,若小于阈值,则设置该网格为不可见,否则设置为可见。

本发明解决其问题所采用的技术方案一方面是:一种游戏细节层次处理方法,其特征在于,该方法包括以下步骤:读取游戏场景中的物体网格,并根据网格生成对应的包围盒,并获取该包围盒在世界空间中的三维坐标;将该包围盒的世界空间坐标转换为视窗坐标,对横纵坐标进行归一化处理;根据得到的视窗坐标重生成为网格,并根据网格生成对应的包围盒,获取该包围盒在世界空间中的三维坐标;根据三维坐标计算横纵坐标轴占用屏幕的比例,得到比例系数;判断比例系数与阈值的大小,若小于阈值,则设置该网格为不可见,否则设置为可见,其中阈值可自定义设置。

进一步的,所述包围盒是由对应网格各个顶点坐标构成的能包围该网格的最小长方体。

进一步的,所述将该包围盒的世界空间坐标转换为视窗坐标包括:包围盒在世界空间坐标中的各个顶点坐标与固有矩阵相乘,得到归一化后的视窗坐标;视窗坐标中的横纵坐标的取值范围均为0到1。

进一步的,所述根据网格生成对应的包围盒包括调用unity引擎接口来直接获得对应的包围盒以及对应信息。

进一步的,所述根据三维坐标计算横纵坐标轴占用屏幕的比例,得到比例系数包括:

建立计算模型:

ratio=bounds.x×bounds.y

其中ratio为比例系数,

其中bounds.x为包围盒在视窗坐标中的横坐标,

其中bounds.y为包围盒在视窗坐标中的纵坐标;

根据计算模型输入包围盒的横纵坐标,得到包围盒的比例系数。

进一步的,所述判断比例系数与阈值的大小,若小于阈值,则设置该网格为不可见,否则设置为可见包括:设置比例系数的阈值;将目标包围盒的比例系数与阈值执行对比,若小于阈值,则设置该包围盒对应的网格为不可见状态,否则设置该包围盒对应的网格为可见状态。

进一步的,所述设置比例系数的阈值可以根据不同手机机型参数设置不同的阈值,其中手机机型参数包括但不限于屏幕大小以及屏幕分辨率。

本发明解决其问题所采用的技术方案另一方面是:一种游戏细节层次处理系统,其特征在于,包括:抓取模块,用于读取游戏场景中的物体网格,并根据网格生成对应的包围盒;坐标转换模块,用于将包围盒的世界空间坐标转换为视窗坐标,对横纵坐标进行归一化处理;网格生成模块,用于根据得到的视窗坐标重生成为网格;计算模块,用于根据三维坐标计算横纵坐标轴占用屏幕的比例,得到比例系数;网格设置模块,用于判断比例系数与阈值的大小,根据判断结果则设置网格的可见状态,其中可见状态包括可见和不可见。

进一步的,所述网格设置模块还包括判断模块,用于判断比例系数与阈值的大小,若小于阈值,则输出设置该网格为不可见的命令,否则输出该网格为可见的命令,其中阈值可自定义设置。

本发明的有益效果是:本发明采用的一种游戏细节层次处理方法及系统,根据屏幕占比进行lod,提高lod的精确度,减少原来根据距离进行lod带来的误差,给用户更好游戏的体验,同时降低大量图像模型的计算量,由此降低运行设备的计算负担。

附图说明

图1所示为根据本发明较佳实施例的方法流程示意图;

图2所示为根据本发明较佳实施例的系统模块框图。

具体实施方式

以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。

需要说明的是,如无特殊说明,本公开中所使用的上、下、左、右等描述仅仅是相对于附图中本公开各组成部分的相互位置关系来说的。在本公开中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。

本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。

unity3d的四种坐标系

1、worldspace(世界坐标):我们在场景中添加物体(如:cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。

2、screenspace(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(screen.width,screen.height),z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,input.mouseposition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,input.gettouch(0).position可以获得单个手指触摸屏幕坐标。

screen.width=camera.pixelwidth

screen.height=camera.pixelheigth

3、viewportspace(视窗坐标):视窗坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,z的位置是以相机的世界单位来衡量的。

4、绘制gui界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(screen.width,screen.height)。

四种坐标系的转换

1、世界坐标→屏幕坐标:camera.worldtoscreenpoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

2、屏幕坐标→视窗坐标:camera.screentoviewportpoint(input.gettouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

3、视窗坐标→屏幕坐标:camera.viewporttoscreenpoint();

4、视窗坐标→世界坐标:camera.viewporttoworldpoint();

参照1所示为根据本发明较佳实施例的方法流程示意图,

读取游戏场景中的物体网格,并根据网格生成对应的包围盒,并获取该包围盒在世界空间中的三维坐标;

unity3d中的mesh(网格)事实上就是我们所说的三角网格。而三角网格是什么呢,三角网格就是由一系列三角形组成的多边形网格,主要用于模拟复杂物体的表面,事实上游戏开发过程中美术给我们的人体、车辆模型都是由一个或多个三角网络(mesh)组成的。

实际中的三角网格,每个三角形都和其他三角形共享边,所以三角网格需要存储三类信息:

顶点:每个三角形由3个顶点。各顶点都有可能和其他三角形共享。

边:连接两个顶点的边。每个三角形有3条边。

面:每个三角形对应一个面。我们可以用顶点或者边的列表表示面。

因此出现了很多有效的网格表示方法,下面我们来讨论一种标准的存储格式:索引三角网格。

2.索引三角网格:

与上面实现的维护一个三角形数组不同,我们在索引三角网格中维护两个列表,顶点表和三角形表。

每个顶点包含一个3d位置,一般也会包括纹理映射坐标(uv坐标),表面法向量,光照值等附加信息(这些信息我们在后面的文章讨论)。通常来说我们要考虑顶点列出的顺序,根据顶点列出的顺序来得出三角面的“正面”或“反面”。

对于场景中的物体计算其mesh(网格)的包围盒bounds。包围盒bounds指的是能包围mesh各个顶点的最小的长方体。在unity里面引擎提供了接口mesh.bounds来获得包围盒。

将该包围盒的世界空间坐标转换为视窗坐标,对横纵坐标进行归一化处理;

用该包围盒的各个顶点坐标转换到viewport空间。转换的方法为将包围盒的各个顶点坐标用

世界空间到viewport空间的矩阵进行转换。进行这样转换的目的在于,viewport空间的x,y坐标即为屏幕的归一化坐标。比如(0.1,0.2,2)中0.1,0.2即为屏幕的横纵坐标,这里屏幕的长宽都已经归一化为1。

根据得到的视窗坐标重生成为网格,并根据网格生成对应的包围盒,获取该包围盒在世界空间中的三维坐标;

利用viewport空间的各个顶点坐标,生成一个新的小mesh,并计算生成的mesh的包围盒bounds

根据三维坐标计算横纵坐标轴占用屏幕的比例,得到比例系数;

计算包围盒的屏幕占用比例ratio=bounds.x*bounds.y,由于bounds是位于viewport坐标空间,x,y坐标已经进行了归一化,所以ratio即为该mesh所占用的屏幕空间比例。这里bounds.x和bounds.y是包围盒的长和宽,在计算包围盒的时候就会生成这两项数据。在unity引擎里,引擎直接提供了生成包围盒的接口

判断比例系数与阈值的大小,若小于阈值,则设置该网格为不可见,否则设置为可见,其中阈值可自定义设置。

对不同性能的机型设置不同的最小比例值。

当ratio小于这个最小比例值时,该mesh设置成不可见。

具体的使用场景可以归纳为

1.建立一个unity3d游戏工程。

2.新建一个游戏场景。

3.放置多个不同大小的模型

4.利用本方案进行lod

参照图2所示为根据本发明较佳实施例的系统模块框图,包括

抓取模块,用于读取游戏场景中的物体网格,并根据网格生成对应的包围盒;

坐标转换模块,用于将包围盒的世界空间坐标转换为视窗坐标,对横纵坐标进行归一化处理;

网格生成模块,用于根据得到的视窗坐标重生成为网格;

计算模块,用于根据三维坐标计算横纵坐标轴占用屏幕的比例,得到比例系数;

网格设置模块,用于判断比例系数与阈值的大小,根据判断结果则设置网格的可见状态,其中可见状态包括可见和不可见。

网格设置模块还包括判断模块,用于判断比例系数与阈值的大小,若小于阈值,则输出设置该网格为不可见的命令,否则输出该网格为可见的命令,其中阈值可自定义设置。

应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。

此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。

进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、ram、rom等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。

计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。

以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1