ios 3D引擎 SceneKit 开发(1) --起始篇

2023-10-24 01:30

本文主要是介绍ios 3D引擎 SceneKit 开发(1) --起始篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hello ,大家好,我是Roc.Tian,最近一直在研究苹果自家的3D 引擎 SceneKit ,适当写写博客,总结一下,与大家分享一下,也希望跟大家交流,共同进步。


SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系:


很清楚的看到,SceneKit 中的坐标系是右手坐标系(笛卡尔坐标系),如果需要与其他3D框架共享数据,先了解其框架是右手坐标系还是左手坐标系。其实也很好转化,就是Z 轴的正负不一样而已。


在开始开发之前,一定要了解下面这几个非常重要的类

类 / 协议

描述

SCNView & SCNSceneRenderer

  类似UIView,用来显示 SceneKit 的内容,定义了一些代理方法,可以用 addSubView 方法添加到UiView 中



SCNScene


SceneKit 内容的容器. 你可以从3D建模工具生成的.dae文件中加载一个场景,或者用代码创建一个 ,然后把它显示在视图上



SCNNode



一个场景的基本构建块,你可以把摄像机,灯光,几何体附加到节点上


SCNGeometry



一个可以连接到一个节点的三维物体。一个几何体(有时称为模型或网格)只定义了一个可见物体的形状。要定义对象的表面颜色图案,你必需要给几何体要附加材料。然后给材料贴图,或者上色,这个几何体表面才会有颜色,或者图案。

你可以从3D建模工具生成的.dae文件中加载一个几何体,也可以用代码创建,SceneKit 提供了几种常见几何体,是SCNGeometry 的子类,比如长方体,球,圆柱球等等,后面我们会写一个demo会把官方提供的几何体给大家列出来,给大家一个直观的感受。 当然我们也可以用三维坐标,法向量自定义几何体,也可以讲一个2D 图案转化成一个具有深度(厚度)的三维几何体。后面应该专门有一篇会讲到利用贝塞尔曲线将一个2D 图案转化成一个具有深度(厚度)的三维几何体。



SCNMaterial



材质,由于在3D建模工具中呈现球形,所以也叫材质球。上色,贴图全靠它。


SCNLight


光源可以附加到节点上,在渲染场景中提供着色


SCNCamera


虚拟摄像机可以附加到节点上,提供了一个场景的视图。



了解以上知识,那我们就来动手开发吧,我们可以在Xcode   中新建一个SceneKit 项目:




运行效果如下:



这个新建的SceneKit 项目 里面会有一些示例代码,我们接下来挑一些重要的注释一下:


  SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];

从 SCN 文件中加载一个场景,也可以从.dae 文件中加载


SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];

获得这个场景中飞机这个节点




 [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];


让飞机一直绕着他的Y  轴旋转


 scnView.allowsCameraControl = YES;

让用户可以控制摄像机,配合下面一句添加手势的代码,用户可以放大,缩小 ,360 度旋转整个场景

gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];


scnView.showsStatistics = YES;      控制下方的统计栏是否显示



单击手势中:


// check what nodes are tappedCGPoint p = [gestureRecognize locationInView:scnView];NSArray *hitResults = [scnView hitTest:p options:nil];

    类似射线检测,检测二维这个点向深无限延深,这个射线上的节点,返回一个数组,可用于单击选中,数组中第一个数据一般就是我们需要的节点。


     [SCNTransaction begin];[SCNTransaction setAnimationDuration:0.5];// on completion - unhighlight[SCNTransaction setCompletionBlock:^{[SCNTransaction begin];[SCNTransaction setAnimationDuration:0.5];material.emission.contents = [UIColor blackColor];[SCNTransaction commit];}];material.emission.contents = [UIColor redColor];[SCNTransaction commit];

SceneKit 中的动画区块,类似 UIKit  中的动画区块。


OK ,起始篇 就简单到这了,下一篇跟大家分享交流 几何体如何贴图,希望大家关注。


我是Roc.Tian   , 欢迎大家拍砖,交流。 邮箱:389744841@qq.com。 也欢迎上海的小伙伴周末约喝下午茶,交流,学习。

这篇关于ios 3D引擎 SceneKit 开发(1) --起始篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271788

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10