- 博客(165)
- 资源 (38)
- 收藏
- 关注
原创 Three.js 入门(一)— 开发环境搭建
WebGL :WebGL(Web图形库)是一个JavaScript API,可在任何兼容的Web浏览器中渲染高性能的交互式3D和2D图形,而无需使用插件。WebGL通过引入一个与OpenGL ES 2.0非常一致的API来做到这一点,该API可以在HTML5 元素中使用。详细了解可参考官方文档。
2024-04-25 16:35:59
1225
2
原创 C++ 入门(八)— 常量和字符串
std::string_view 不会分配内存,也不会拷贝字符串,因此在处理大字符串或者需要频繁修改字符串的场景下,std::string_view 可以提供更好的性能。需要注意的是,std::string_view 只是引用了字符串,而不拥有它。虽然 C 样式的字符串文本很好用,但 C 样式的字符串变量行为奇怪,难以处理(例如,您不能使用赋值为 C 样式的字符串变量分配一个新值),并且很危险(例如,如果您将较大的 C 样式字符串复制到分配给较短的 C 样式字符串的空间中,则会导致未定义的行为)。
2024-02-29 14:59:22
1270
原创 C++ 入门(七)— 基本数据类型
在这种格式中,浮点数为 4 个字节,double 为 8 个字节,长 double 可以等效于 double(8 字节)、80 位(通常填充为 12 个字节)或 16 个字节。默认情况下,字符可以是有符号的,也可以是无符号的(尽管它通常是有符号的)。此后缀的意思是“类型”,它是应用于现代类型的常见命名法。整数是一种整数类型,可以表示正整数和负整数,包括 0(例如 -2、-1、0、1、2)。整数类型还可以采用可选的 signed 关键字,但是,不应使用此关键字,因为它是多余的,因为默认情况下整数是有符号的。
2024-02-27 11:13:53
881
原创 C++ 入门(六)— 调试程序(Debugging)
如果希望此程序按字母顺序打印名称,但它以相反的顺序打印它们,则问题可能出在 sortNames 函数中。1、由于写入日志文件的信息与程序的输出是分开的,因此可以避免因混合正常输出和调试输出而导致的混乱。但是,在大多数情况下,编译器将无法捕获大多数此类问题,因为编译器旨在强制执行语法,而不是意图。通常,日志会写入磁盘上的文件(称为日志文件),以便以后可以查看。背后的功能是双重的:精确控制程序执行的能力,以及查看(并根据需要修改)程序状态的能力。我们还可以输出变量(包括参数)或表达式的值,以确保它们是正确的。
2024-02-26 18:05:43
1239
原创 OpenGL 入门(十)— 光照系统
介绍三种光源类型:平行光(Directional Light)、点光源(Point Light)、聚光灯(Spot Light)。平行光,也叫定向光,当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行。不论物体和/或者观察者的位置,看起来好像所有的光都来自于同一个方向。因为它的所有光线都有着相同的方向,它与光源的位置是没有关系的。平行光可以照亮的范围是没有限制的,它通常是作为太阳这样的角色在场景中出现的。我们可以定义一个光线方向向量模拟一个定向光:注意,我们对向量取反。我们目前使用的光照计
2024-02-06 16:36:38
1152
原创 OpenGL 入门(九)—Material(材质)和 光照贴图
从实际角度来说,木头其实也有镜面高光,尽管它的反光度(Shininess)很小(更多的光被散射),影响也比较小,但是为了教学目的,我们可以假设木头不会对镜面光有任何反应。只是在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map)(3D艺术家通常都这么叫它),它是一个表现了物体所有的漫反射颜色的纹理图像。然后,我们将在片段着色器中再次需要纹理坐标,所以我们声明一个额外的输入变量。事实上,纹理与贴图原理是一样的,贴图也叫纹理贴图,其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。
2024-02-05 21:07:21
2240
原创 OpenGL 入门(八)— 标准光照模型
一个通过计算环境光,漫反射,和镜面光分量的值来估计真实光照的模型。通过给每个没有被光照的物体很小的亮度,使其不是完全黑暗的,从而对全局光照进行估计。一个顶点/片段与光线方向越接近,光照会越强。使用了法向量来计算角度。反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。一个垂直于平面的单位向量。法线矩阵(Normal Matrix): 一个3x3矩阵,或者说是没有平移的模型(或者模型-观察)矩阵。它也被以某种方式修改(逆转置),从而在应用非统一缩放时,保持法向量朝向正确的方向。
2024-02-05 15:55:23
1338
原创 OpenGL 入门(七)— Camera(摄像机)
OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。名词介绍LookAt矩阵: 一种特殊类型的观察矩阵,它创建了一个坐标系,其中所有坐标都根据从一个位置正在观察目标的用户旋转或者平移。欧拉角(Euler Angles): 被定义为偏航角(Yaw),俯仰角(Pitch),和滚转角(Roll)从而允许我们通过这三个值构造任何3D方向。观察空间(View Space)也叫摄像机空间(Camera Spac
2024-02-04 17:44:42
1516
原创 OpenGL 入门(六)— Coordinate Systems(坐标系统或坐标空间)
坐标转换为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。下面一个Cube从模型坐标本投射到屏幕坐标上完整流程展示:顶点位置和法向量等几何数据在OpenGL流水线中通过顶点操作和原始装配操作进行转换,然后再进行网格化处理。上述的每一个步骤都创建了一个变换矩阵:模型矩阵、观察矩阵和投影矩阵。
2024-02-02 19:12:51
1173
原创 C++ 入门(五)— 头文件(Header files)
这样做通常会导致违反单一定义规则 (ODR) 的情况,即头文件包含在多个源文件中。标头防护旨在确保给定头文件的内容不会多次复制到任何单个文件中,以防止重复定义。重复声明是可以的,但即使头文件由所有声明(无定义)组成,最好还是包含标头保护。请注意,标头防护不会阻止将头文件的内容(一次)复制到单独的项目文件中。这是一件好事,因为我们经常需要从不同的项目文件中引用给定标头的内容。
2024-02-02 09:45:44
2314
原创 C++ 入门(四)— 预处理器(preprocessor)介绍
在编译之前,每个代码 (.cpp) 文件都会经历预处理阶段。在此阶段,称为预处理器的程序对代码文件的文本进行各种更改。预处理器实际上不会以任何方式修改原始代码文件,相反,预处理器所做的所有更改要么临时发生在内存中,要么使用临时文件。预处理、编译、链接的整个过程称为翻译。
2024-02-01 17:40:08
616
原创 OpenGL 入门(五)— Transform(坐标变换)
一个特殊的位置,即原点,它是整个坐标系的中心;两条过原点的互相垂直的矢量,即x轴和y轴。这些坐标轴也被称为是该坐标系的基矢量;
2024-02-01 15:14:12
1204
原创 C++ 入门(三)— 函数
C++ 程序的方式工作。当程序遇到函数调用时,它将在一个函数内按顺序执行语句。函数调用是告诉 CPU 中断当前函数并执行另一个函数的表达式。CPU 在当前执行点“放置一个标记”,然后调用(执行)函数调用中指定的函数。当调用的函数结束时,CPU 将返回到它添加标记的点,并继续执行。void doPrint() // 函数定义int main()doPrint();// 函数调用doPrint();// 函数调用return 0;C++ 中不支持嵌套函数。
2024-01-31 19:21:35
843
原创 OpenGL 入门(四)— Textures(纹理)
纹理(Texture)。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。除了图像以外,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上。纹理映射(Map)下面的图片展示了我们是如何把纹理坐标映射到三角形上的。0.0f, 0.0f, // 左下角1.0f, 0.0f, // 右下角0.5f, 1.0f // 上中。
2024-01-31 14:09:19
1444
原创 C++ 入门(二)— 基础知识
输入/输出库(io 库)是处理基本输入和输出的 C++ 标准库的一部分。而使用插入运算符 () 将数据打印到控制台(代表“字符输入”),则使用提取运算符 (>>) 从键盘读取输入。在这方面,它们的行为很像自然语言中的句子。对象是可以存储值的存储区域(通常是内存),并具有其他相关属性。尽管 C++ 中的对象可以是未命名的(匿名),但更多时候我们使用标识符来命名对象。这意味着我们可以专注于使用对象来存储和检索值,而不必担心这些对象实际上被放置在内存中的哪个位置。在 C++ 中,语句通常分组为称为函数的单元。
2024-01-30 19:18:45
909
原创 OpenGL 入门(三)— Shader(着色器)
着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信。它们之间唯一的沟通只有通过输入和输出。
2024-01-30 14:36:11
2158
原创 C++入门(一)— 使用VScode开发简介
C++(发音为“see plus plus”)由贝尔实验室的Bjarne Stroustrup开发,作为C的扩展,从1979年开始。C++ 为 C 语言添加了许多新特性,也许最好将其视为 C 的超集,尽管这并不完全正确(因为 C99 引入了一些 C++ 中不存在的功能)。C++之所以声名鹊起,主要是因为它是一种面向对象的语言。至于什么是“对象”,以及它与传统编程方法有何不同,我们将在后面的章节中介绍。
2024-01-29 20:11:43
1734
原创 OpenGL 入门(二)— 顶点数组对象(VAO)和顶点缓冲对象(VBO)
顶点数组对象(Vertex Array Object,VAO): 存储缓冲区和顶点属性状态。顶点缓冲对象(Vertex Buffer Object,VBO): 一个调用显存并存储所有顶点数据供显卡使用的缓冲对象。元素缓冲对象(Element Buffer Object,EBO):也叫索引缓冲对象(Index Buffer Object,IBO): 一个存储元素索引供索引化绘制使用的缓冲对象。标准化设备坐标(Normalized Device Coordinates, NDC)
2024-01-29 16:13:43
1691
原创 OpenGL 入门(一)— 创建窗口
OpenGL: 一个定义了函数布局和输出的图形API的正式规范。GLFW:一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入,对我们来说这就够了。GLAD: 一个扩展加载库,用来为我们加载并设定所有OpenGL函数指针,从而让我们能够使用所有(现代)OpenGL函数。视口(Viewport): 我们需要渲染的窗口。
2024-01-26 19:05:19
1332
1
原创 OpenGL — 介绍与VSCode环境配置
一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要
2024-01-26 16:21:11
1509
原创 UE5 C++(十七)— 射线检测
射线检测简单来说就是通过相机发射一条射线,用来检测对象的一种检测机制。使用射线进行命中判定这里主要介绍4种常用的射线检测方式。
2024-01-17 15:15:19
1392
2
原创 UE5 C++(十六)— Timeline的使用
这里有官方文档介绍比较详细,我这边简单描述,重在实践。时间轴(Timeline)可以实现从事件中播放基于时间的动画,这些事件可以沿着时间轴在关键帧处触发。可以使用时间轴来处理简单的非动画任务,例如开门、更改光源或对场景中的Actor执行其他以时间为中心的操纵。关键组件:UTimelineComponent包含一系列的 事件(events)、 浮点数(floats)、向量(vectors) 或 颜色(colors) 及其关联的关键帧。这些内容继承自UActorComponents。
2024-01-10 12:51:43
2512
2
原创 UE5 C++(十五)— TimerHandle(定时器)的使用
定时器(Timer) 可用于执行延迟类型的操作,或让某些操作在一段时间内重复执行。定时器的设置只需三步即可完成:声明定时器句柄 FTimerHandle、定义执行函数、设置定时器,其中前两步是第三步的预备工作。首先是声明定时器句柄 FTimerHandle,代码实现如下:定义执行函数设置定时器注意:SetTimer() 各个参数的作用如下:编译之后,运行打印结果。这就像申请了资源,一定要归还一样。取消定时器的话,建议直接使用ClearTimer(),其用法示例如下:清除定时器可在 Actor
2024-01-10 10:44:29
1810
原创 UE5 C++(十四)— Interface的使用
接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。接口类中不可以声明成员变量,静态变量。可以声明静态常量作为接口的返回值状态,需要在对应的cpp中定义并初始化,访问时需要使用"接口类型::静态常量名"访问定义的接口方法使用virtual 修饰符 和 “=0” 修饰,表示该方法是纯虚的。因为接口类是无法创建对象的,所以不应该编写构造函数和析构函数。
2024-01-09 11:07:26
1687
原创 UE5 C++(十三)— 创建Character,添加增强输入
最后,拖到场景中,把WorldSetting -> Game Mode 设置为null。最后,可以编译一下,看看输入模块(“EnhancedInput” )是否引入成功。在DEMO.Build.cs 脚本中添加增强输入模块。这时候会有默认组件,缺少人物模型,我们可以在这里添加。编译之后,创建蓝图类BP_MyCharacter。点击运行,就可以实现鼠标,键盘第三人称操作了。有个容易出错的点,这里的设置一定要正确。创建MyCharacter C++类。然后添加引用到C++头文件中。首先,是头文件添加引用。
2024-01-08 11:56:18
1196
1
原创 UE5 C++(十二)— 委托(代理)、多播委托
这个官网上有很详细介绍,这里介绍几个点委托 是一种泛型但类型安全的方式,可在C++对象上调用成员函数。可使用委托动态绑定到任意对象的成员函数,之后在该对象上调用函数,即使调用程序不知对象类型也可进行操作。复制委托对象很安全。你也可以利用值传递委托,但这样操作需要在堆上分配内存,因此通常并不推荐。请尽量通过引用传递委托。
2024-01-05 11:15:07
1557
原创 UE5 C++(十一)— 碰撞检测
创建刚才脚本的蓝图类 BP_MyCustomActor 并放到场景中。首先,创建自定义ActorC++类 MyCustomActor。Hit事件的代理绑定之后运行 ,当人物尝试一直前进碰到锥体时会。这个是绑定BeginOverlap和EndOverlap。然后,添加第三人称人物,并拖拽到场景中。完整的MyCustomActor脚本。以上面同样的方式创建Hit的绑定实现。运行之后,碰到和离开都会打印日志。这个是Hit事件的代理绑定。不同的是修改碰撞设置。官网上有相关参考文档。
2024-01-04 11:12:56
2007
原创 UE5 C++(十)— 鼠标控制相机移动
在Default Pawn Class 继承类MyPawn中实现。添加AMyPlayerController.h中添加输入绑定。添加AMyPlayerController.cpp中实现绑定。Wheel_Down:代表鼠标滑轮后前移。最后,我们可在运行时设置初始值看看效果。Wheel_Up:代表鼠标滑轮往前移。在默认Pawn中添加相机对外控制方法。首先添加摇臂和相机组件。然后,在构造函数中实现。编译之后,创建蓝图类。
2024-01-03 14:15:29
833
1
原创 UE5 C++(九)— 静态、动态加载类和资源
然后想,创建蓝图类BP_MyCustomActor。编译后,创建蓝图拖到场景中,点击运行。编译后,创建蓝图拖到场景中,点击运行。编译后,创建蓝图,打开后打印日志。到这里,都显示引用上。编译后,会显示引用上。
2023-12-26 12:18:09
1234
原创 UE5 C++(八)— 创建Actor、添加组件
详细介绍可以去看Actor和几何体官方文档还有大钊的这篇文章《InsideUE4》GamePlay架构(一)Actor和Component所有可以放入关卡的对象都是 Actor,比如摄像机、静态网格体、玩家起始位置。Actor支持三维变换,例如平移、旋转和缩放。你可以通过游戏逻辑代码(C++或蓝图)创建(生成)或销毁Actor。在C++中,AActor是所有Actor的基类。
2023-12-21 10:58:16
3299
原创 UE5 C++(七)— UObject、UGameInstance实例化
GameInstance是全局唯一单例,这个在引擎初始化的时候就已经生成,一直存在到引擎关闭。主要用于为游戏保存全局临时数据,想要持久化保存需要用SaveGame。注意:要实现运行时调用可在这里提前配置,具体参考之前文章。在MyObject.cpp中实现。在MyObject.h中实现。编译后,在项目设置中配置。在MyPawn中调用。
2023-12-19 12:27:18
1242
原创 UE5 C++(六)— 枚举UENUM、结构体USTRUCT和补充属性说明符
编译之后,创建一个关联的信息表格,保存为.csv格式。注意,定义结构体名称前要加F前缀,不然编译不通过。调用枚举,使用TEnumAsByte模板。蓝图生成时暴露变量,方便赋予变量的初始值。编译后在蓝图中可以看到。先创建一个结构体数据类。然后拖到项目文件目录中。编译后,打开关卡蓝图。
2023-12-18 11:29:59
3105
原创 UE5 C++(五)— UPROPERTY宏(属性说明符和元数据说明符)
声明带有BuleprintImplementableEvent函数在.h文件中声明,需要在.cpp文件中实现。UPROPERTY(EditAnywhere,BlueprintReadWrite):在蓝图中可读、可写 可以获取和设置变量。声明带有BuleprintImplementableEvent函数在.h文件中声明,不需要在.cpp文件中实现。UPROPERTY(EditInstanceOnly):仅在实例化细节面板可编辑。UPROPERTY(EditDefaultsOnly):仅在默认设置下可编辑。
2023-12-15 10:30:00
3032
1
原创 UE5 C++(四)— 容器(TArray,TMap,TSet)
TArray是虚幻c++中的动态数组,TArray特点:速度快,内存消耗小,安全性高。并且TArray所有元素均完全为相同类型,不能进行不同元素类型的混合。TMap-是一种键值对容器,里面的数据都是成对出现的(Key,Value),Value通过Key值来获取,且Key值不能重复,key值唯一。在C++中创建TMap。在蓝图中创建TMap。在蓝图中创建TSet。
2023-12-14 17:20:55
1470
原创 UE5 C++(三)— 基本用法(生命周期、日志、基础变量)
忘记说了每次在Vscode修改后C++脚本后,需要编译一下脚本,为了方便我是点击这里编译脚本。
2023-12-14 15:30:10
1327
原创 UE5 C++(二)— 游戏架构介绍
此外,Game Mode 的蓝图十分实用,因为它们无需调整代码即可启用变量调整。因此可用于使单一 Game Mode 适用到多个不同关卡,无需使用硬编码资源引用或为每次调整请求工程支持和代码修改。如从 AGameMode 进行继承,也可从 AGameState 继承游戏状态(其支持比赛状态机)。AGameMode 是 AGameModeBase 的子类,拥有一些额外的功能支持多人游戏和旧行为。可创建派生自 Game Mode 类的蓝图,并将它们用作项目或关卡的默认 Game Mode。
2023-12-14 11:48:01
898
原创 UE5 C++(一)— 入门介绍
表示项目环境依赖信息,用到哪些模块(“Core”,“CoreUObject”,“Engine”,“InputCore”,这些是初始内置模块)。GENERATED_BODY() :表示我们不直接使用父类的构造函数,如果要定义类中初始化操作,需要在.h头文件中声明构造函数,然后在.cpp文件中实现构造函数,它之后的成员是private的。
2023-12-14 10:51:35
1838
对象池pool项目工程.unitypackage
2019-12-12
Unity-播放GIF图.unitypackage
2019-10-11
Unity Excel导入导出工具项目案例.unitypackage
2019-09-29
unity 实用工具standaloneFileBrowser.unitypackage
2019-09-27
unity-Excel-导入excel数据表.unitypackage
2019-09-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人