Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Scenekit着色器-禁用平滑着色和任何法线插值

Scenekit着色器-禁用平滑着色和任何法线插值
EN

Stack Overflow用户
提问于 2017-03-09 07:10:22
回答 2查看 1.9K关注 0票数 5

我有一个从Blender导出的动画模型(collada)。根据我的理解,着色器尝试在动画过程中插值法线,我想防止这种情况发生。我的模型非常笨重,但Scenekit让它像Apple Product一样平滑。我希望它看起来像“我的世界”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-10 09:01:58

我假设你想要一个平坦的阴影低多边形,看起来类似于下面的左边所示。

本例使用SCNSphere作为几何源,但它也应该适用于从dae文件加载的几何体。

您加载的模型和默认的SCNSphere由许多面组成。在平滑模型中,顶点通常在面之间共享,每个顶点只能有一条法线。我们需要做的是确保每个面不与相邻的面共享顶点,并且每个顶点上使用的法线仅基于面的法线方向计算。

SceneKit本身没有任何原生功能来做这件事,但是苹果的另一个框架有……ModelIO。

您需要导入ModelIO。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import ModelIO
import SceneKit.ModelIO

我用来生成上面两个球体的代码如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let geom = SCNSphere(radius: 0.5)

// convert SceneKit geometry to ModelIO mesh object
let modelMesh = MDLMesh(scnGeometry: geom)
// ensure vertices are not shared with neighbouring faces
modelMesh.makeVerticesUnique()
// replace existing 'smooth' normal definition with an 'non-smoothed' normal
modelMesh.addNormals(withAttributeNamed: "normal", creaseThreshold: 1.0)

// create SceneKit geometry from ModelIO mesh object
let flattenedGeom = SCNGeometry(mdlMesh: modelMesh)
let flattenedNode = SCNNode(geometry: flattenedGeom)
scene.rootNode.addChildNode(flattenedNode)

// smooth sphere for comparison only
let sphereNodeSmooth = SCNNode(geometry: SCNSphere(radius: 0.5))
sphereNodeSmooth.position = SCNVector3Make(0, 1.2, 0)
scene.rootNode.addChildNode(sphereNodeSmooth)

当然,我可能会建议您在Blender中修改模型,以便以这种方式导出(唯一顶点,非平滑法线)。这将使您的应用程序不必在加载资产时进行比所需更多的处理。不幸的是,我的搅拌器知识有点欠缺。

票数 6
EN

Stack Overflow用户

发布于 2018-03-27 12:20:50

当使用所有相邻面平均顶点法线时,将出现平滑着色。在这种情况下,渲染引擎通过为相邻面插入颜色来渲染边缘,看起来面会变得更加“平滑”。

您可以删除顶点的法线信息以防止出现这种情况。

如果您更喜欢使用SCNGeometry

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SCNGeometry* flatGeoUsingScnKit(SCNGeometry *geo){
    NSArray<SCNGeometrySource*> *SourceArr = geo.geometrySources;
    NSMutableArray<SCNGeometrySource*> *newSourceArr = [NSMutableArray new];
    for (SCNGeometrySource *source in SourceArr) {
        if (source.semantic != SCNGeometrySourceSemanticNormal) {
            [newSourceArr addObject:source];
        }
    }
    SCNGeometry *flatGeo = [SCNGeometry geometryWithSources:newSourceArr elements:geo.geometryElements];
    return flatGeo;
}

或ModelI/O

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SCNGeometry* flatGeoUsingModelIO(SCNGeometry *geo){
    MDLMesh *mesh = [MDLMesh meshWithSCNGeometry:geo];
    MDLMesh *newMesh = [MDLMesh newSubdividedMesh:mesh submeshIndex:0 subdivisionLevels:0];
    [newMesh removeAttributeNamed:@"normals"];
    //Replace current vertex normals with a non-smooth one. Same result with above line
    //creaseThreshold is the cos value of MAX crease angle you can tolerate
    //[newMesh addNormalsWithAttributeNamed:@"normals" creaseThreshold:1];
    SCNGeometry *flatGeo = [SCNGeometry geometryWithMDLMesh:newMesh];
    return flatGeo;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42688892

复制
相关文章
p5.js 使用npm安装p5.js后如何使用?
在 《p5.js 光速入门》 中都是使用 CDN 的方式去使用 p5.js 的,不太符合当下的开发习惯。
德育处主任
2022/12/28
2.7K0
p5.js 使用npm安装p5.js后如何使用?
LintCode 形状工厂题目代码
工厂模式是一种常见的设计模式。实现一个形状工厂 ShapeFactory 来创建不同的形状类。这里我们假设只有三角形,正方形和矩形三种形状。
desperate633
2018/08/22
4360
使用opencv读入并显示一幅彩色图像,灰度化并显示,用canny算子得到图像边缘并显示
要求步骤: 1.读入彩色图像,并显示; 2.将彩色图像灰度化,并显示; 3将灰度图像,用Canny边缘算子得到图像边缘,并显示。
川川菜鸟
2021/10/18
1.2K0
使用hooks自动监测git仓库更改并拉取
我们在务器上使用宝塔进行操作,使用宝塔比较直接,可视化,各种操作和安装东西很方便(如果只是想安装一些东西,快速搭建),后面也会继续使用宝塔为网站安装https证书,使用Let's Encrypt
caoayu
2020/09/23
1.1K0
使用hooks自动监测git仓库更改并拉取
WordPress 评论区添加图片代码并自动显示
Power
2023/06/01
3610
使用纯CSS代码更改WordPress全站字体
不少博主喜欢美化自己的博客,而一个好看的字体可以让人眼前一亮,还可以提高阅读舒适度。作为一个二次元类(伪)的博客怎么能没有一个可爱的字体呢?
Daimon
2022/03/11
1.9K0
为了方便使用,Jupyter移动到桌面并更改路径。
1、点击[在这里输入你要搜索的内容] 2、点击[Jupyter Notebook] 3、点击[打开文件所在位置] 4、点击[点击Jupyter Notebook] 5、点击[发送到] 6、点击[桌面快捷方式] 7、点击[Jupyter Notebook] 8、按<Win+R>键 9、点击[确定] 10、点击[命令行窗口] 11、按<Enter>键 12、点击[搜索Everything] 13、点击[搜索] 14、点击[.Jupyter]
裴来凡
2022/05/28
3K0
为了方便使用,Jupyter移动到桌面并更改路径。
Python Django使用HttpResponse返回图片并显示
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
菲宇
2019/10/22
2.4K0
使用正则匹配并显示匹配的内容
最近在解析HTML文件,遇到这样的一个场景。我需要将HTML文件中data-url="xxx"中的xxx查找并显示出来。
大江小浪
2018/07/24
3K0
代码在内存中的'形状'
代码在内存中的'形状' http://zoo.zhengcaiyun.cn/blog/article/code-shape
政采云前端团队
2023/02/27
4830
代码在内存中的'形状'
Modelsim仿真--波形状态机名称显示
在通常的modelsim波形仿真中,状态机的显示为16进制,如 3‘h1。如下图所示str_cur为状态跳变信号。
FPGA开源工作室
2021/07/30
7990
形状地图中异常值的处理方法
这种设置对于左上角的地区可以看到颜色非常的深,很容易就区分出数量值很大,其他的区域就没有这么明显,如果同时想要突出显示中间数值区域和小数值区域,此种方式就会显得不适合。
逍遥之
2020/04/26
8170
FatFs检测并建立多层目录并更改文件名
FatFs检测文件路径是否存在,不存在就建立多层目录,最后更改文件名 if(W_Dresult==FR_OK) { wifi_dp_wav_file_status=0; start_downloading=0; /*************************************遍历创建文件夹*************************************************************/ u8 opendir_err = 0; /
小锋学长生活大爆炸
2020/08/13
1.8K0
完美:C# Blazor中显示Markdown并添加代码高亮
昨天发了一篇介绍这个库:C# Blazor中显示Markdown文件,介绍怎么在Blazor中显示Markdown内容的文章,文章内的代码是没有高亮的,思来相去,还是要做好,于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown,现在渲染效果如下:
沙漠尽头的狼
2022/03/26
1.7K0
完美:C# Blazor中显示Markdown并添加代码高亮
Endnote 域代码已更改
word中参考文献位置出现“域代码已更改”的批注,并且还没有办法删除,现提供如下两个可能可以的解决方法:
全栈程序员站长
2022/06/26
8940
Laravel5.8使用LayUI上传并显示图片操作
这个问题已经困扰好久了,唉 比较难受,本来学习laravel使用的是Bootstrap,之后用的是Uploadify进行上传图片,无奈,这个技术需要Flash的支持,一直没有实现,后来思考再三,还是选择用Layui后台框架进行设计,emm~~~毕竟用他的组件可以实现和Uploadify一样的无刷新上传图片的效果,但是比较难受的就是Laravel使用Layui进行回调函数显示图片的时候,Laravel总是莫名的增加了域名之外的控制器及方法名称,比较难受,不,是特别难受,从网上及QQ群大神中也没有问出个所以然,不过,我最后实现的是用的比较笨的方式,就是拼接为字符串的形式进行链接返回调用,(使用前台添加域名的方式实现了emm~~)好了 话不多说,看看实现的代码吧!
Meng小羽
2019/12/23
2.6K0
[PHP] 读取大文件并显示
使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据
唯一Chat
2019/09/10
1.2K0
[PHP] 读取大文件并显示
PHP从数据库提取并显示数据的典型代码
PHP从数据库提取并显示数据的典型代码如下: if ($res=mysql_query($sql)) { //数据库查询执行成功 while($row=mysql_fetch_array($res)){ //循环查询满足条件的所有记录 echo '姓名:'.$row['name'] . '成绩:'. $row['score']. ''; } //删除查询 mysql_free_result(
似水的流年
2019/12/06
1.9K0
如何在施工物料管理Web系统中处理大量数据并显示
最近在开发施工物料管理系统,其中涉及大量的物料信息需要管理和汇总,数据量非常庞大。之前尝试自己通过将原始数据,加工处理建模,在后台代码中通过分组、转置再显示到 Web 页面中,但自己编写的代码量非常大,而且性能很差简直无法忍受。后来使用了矩表控件非常好的解决了需求,本文主要介绍之前如何通过代码将数据展现在页面中,以及使用矩表控件创建行列转置和动态列表格,并显示在网页中。 一、通过代码将数据展现在页面的步骤 1.行列转置代码片段: public static DataTable GetCrossTable(D
葡萄城控件
2018/01/10
2.6K0
如何在施工物料管理Web系统中处理大量数据并显示
点击加载更多

相似问题

使用形状的Fizzbuzz (p5.js)

10

如何使用keyIsDown (p5.js)移动形状

27

如何使用JAVA代码读取形状(.shp)文件并显示其值

13

使用p5.js在图像上摆动形状

10

p5.js顶点形状换行

111
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文