画一个姑娘陪着你 | 情人节特辑

Android 下内联汇编开发指南:从基础语法到多架构适配全掌握 由于 Android 设备可能使用不同的 CPU 架构(如 ARM、ARM64、x86 和 x86_64),使用条件编译和 NDK 的特性,我们可以让代码适配不同的 CPU 架构。) 指令,判断当前编译架构并编写相应的内联汇编代码。在 Android 开发中,编写兼容不同架构的内联汇编代码时,可以通过条件编译来处理不同的指令集。占位符用于在汇编指令中插入 C++ 变量,格式为 %0、%1 等,对应输出和输入操作数的顺序。汇编指令:这是我们想要执行的汇编代码,通常是 ARM 或 ARM64 指令。 阅读详情

情人节快乐!又到了一年一度的情人节,今年依然是 new 一个对象吗?太 low 了,来用代码画一个吧~

说搞就搞,Let's go ~

实现方案

基于 Android 平台,使用 Kotlin + C++ 的方式实现。

上层负责 UI 相关,以及监听用户交互事件,并通过 JNI 交给 Native 层做具体响应。

Native 层则负责模型的解析、视图变换、Shader 渲染等逻辑。

主要的 JNI 一览

// Surface 创建
external fun nativeSurfaceCreated(assertManager: AssetManager, modelDir: String, modelFile: String, animFile: String)
// Surface 调整
external fun nativeSurfaceChanged(width: Int, height: Int)
// Surface 绘制当前帧
external fun nativeDrawFrame()
// 通知触摸事件
external fun nativeTouchEvent(deltaX: Float, deltaY: Float)
// 相关生命周期事件
external fun nativeDestroy()
external fun nativePause()
external fun nativeResume()

3D 模型的解析

OpenGL 2.0 引入了管线的概念,从管线的流程来看,在栅格化之后,就变成了一个一个的点,然后通过 Fragment Shader 上色。

所以绘制复杂的 3D 模型,最终也是转成无数的点去渲染。事实上,点可以连成线,线可以连成面,面可以拼成一个完整的物体。

所以,我们需要把 3D 模型转成无数个点坐标才可以渲染。

Assimp(Open Asset Import Library)是一个很强大的开源库,支持把 40 多种格式的 3D 模型文件转成统一的格式,然后再按照再解析这个统一的格式即可。

关于 Assimp 的官网,公众号文章不能放外链,需要的直接 Google 就可以搜到。

Assimp 把模型文件转成了统一的格式,这个格式可以理解为是一颗二叉树,从 Root Node 开始,逐渐发散。假设 Root Node 在心脏的位置,那么就是从心脏遍布到全身。

通过对二叉树进行广度优先遍历,就可以拿到所有节点信息,进而拿到所有点的坐标信息。然后交给 OpenGL 进行渲染。

骨骼动画

3D 模型解析出坐标信息之后,结合纹理信息,就可以得到一个静态的图片。那么怎么做动画呢?

所谓动画,其实是各个点的一系列坐标点的有序变化,人眼看上去就是正常的动画了。

Assimp 解析出的统一格式,大致是一颗二叉树,二叉树的两个顶点之间的线,称为「骨骼」,做动画时,骨骼做仿射变换,带动附近的「肌肉」跟着联动,就像人做运动一样,骨骼带着肉体做运动。

类比骨骼带动肌肉群实现动画,谓之「骨骼动画」。

透视变换 与 Camera 视角变换

3D 效果的最直观的感觉就是「近大远小」。

Camera 视角变换,用来做旋转。

呐,给你画了个姑娘

经过上面一波处理,你有对象了!

情人节快乐!

用一个姑娘换你一个“在看”!

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位 阅读详情

相关推荐

【大二组培训】2017年电子设计大赛H题总结(软件部分)

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt im

HAIBARA的博客 3021

JNI中java和jni的基本交互

Jni和java/kotlin的基本交互

weixin_36295221的博客 920

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。

weixin_28358083的博客 198

NDK 基础知识–JNI java与c++

NDK 基础知识–JNI 开发环境: Android studio v3.6.1 (3.6.0都支持kotlin与c/c++互相调用,是该学学NDK了,不能再找理由了) NDK 可以让我们Android 应用中使用C、C++代码。以前Android 都是使用java,NDK中包含JNI (java本地接口)可以使用java 调用c、c++等。如今kotlin被Android 官方宣布第一开发语言...

knight康康的博客 643

Unreal 5 MetaHuman插件全流程:从安装到角色动画生成

本文详细介绍了Unreal 5中MetaHuman插件的全流程使用指南,从安装配置到角色动画生成。通过Quixel Bridge下载预设角色,利用面部捕捉技术赋予数字人模型生命力,并提供材质编辑、性能优化等进阶技巧,帮助用户快速创建照片级真实的虚拟角色。

weixin_29009081的博客 829

基于STM32L4XX、HAL库的MCP4561数字电位器驱动程序设计

/ HAL库需要左移一位。* @param address: 设备地址(0x2C-0x2F)* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hi2c: I2C句柄。

zhusl6688的博客 340

Android JNI手册——Java/Kotlin与Native层的相互调用

Android JNI中值/方法的传递与调用一级目录二级目录三级目录 按照习惯,我还是会用Kotlin做示范。 一级目录 二级目录 三级目录

黑马小杰的博客 5462

LLC型自驱动半桥谐振变换器:电压电流变化与自然换向解析

变换器的工作状态经历了多个阶段,从模态一的关断状态,到模态二和三的电流供电状态,每个阶段都得到了合理的设计和优化。的工作原理,尤其是在半个周期内的电压和电流变化。上图 展示了该变换器在工作时的电压和电流波形,它为我们揭示了变换器如何通过精确的电流和电压控制,优化性能并实现高效能转换。,并根据负载情况调整电流和电压的工作模式,能够极大提升变换器的效率,尤其是在零电压开通和自然换向的设计中,发挥着关键作用。这意味着,电流会随着时间周期的变化,呈现典型的振荡波形,从而达到良好的电流控制。是两个关键的电流变量。

weixin_43199439的博客 279

骚操作!程序员用代码画个姑娘过情人节

作者 |肖哥来源 |肖小的人儿(ID:gh_8aa6fc238842)情人节快乐!又到了一年一度的情人节,今年依然是 new 一个对象吗?太 low 了,来用代码画一个吧~说搞就搞,...

程序人生的博客 1177

优快云独家首发!万字长文,YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

🍀🍀🍀YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程,全网最强,学不会算我输!!!

Coding... 1万+

在Simulink中搭建一个基于IoT设备间通信协议栈的仿真模型

物联网(IoT)设备间的通信协议栈仿真对于理解不同层级的协议如何协同工作,以及优化网络性能至关重要。通过Simulink结合MATLAB的强大功能,我们可以模拟和分析从物理层到应用层的完整通信过程。下面详细介绍如何使用Simulink进行IoT设备间通信协议栈的仿真。

amy_mhd的博客 156

Android串口开发

Android,串口,SerialPort

828

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

超详细的Android NDK开发环境搭建(1)

注:这里使用的是kotlin语言,方法使用external修饰,如果是java则用native修饰。此函数的功能为返回一个字符串:“Hello from C++”。

2401_84538474的博客 985

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OpenCV + Kotlin 实现 USB 摄像头(相机)实时画面、拍照

pexels-regina-trissteria-13623557.jpgPart1一. 业务背景我们团队前段时间做了一款小型的智能硬件,它能够自动拍摄一些商品的图片,这些图片将会出现在电商 App 的详情页并进行展示。基于以上的背景,我们需要一个业务后台用于发送相应的拍照指令,还需要开发一款软件(上位机)用于接收拍照指令和操作硬件设备。Part2二. 原先的实现方式以及痛点早期为了快速实现功能,...

Java与Android技术栈 3347

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Kotlin进阶学习笔记01

Kotlin进阶学习笔记 从源码分析学习Kotlin,知其然、知其所以然。 通用基础语法学习Kotlin官网或快速语法学习笔记 1. Why Kotlin 之官方说辞 简洁Concise:data class、lambda、快速单例类object 安全Safe:Nullable类型区分,自动推断 //区分nullable var str:String//不同于String? str=null//编译则报错,因为String类型非空,任何可空类型需要?符号,比如String? //避免N

志威梦优快云博客 997

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

external 的使用

外部变量以及其作用域 main 里面的变量,像line, longest等,对main来说是私有的或者是局部(local)的,因为它们是在main里面声明的,别的函数中的变量也是一样的,比如说,getline中的的i和copy中的i 是没有任何关系的,只有当函数被调用的时候,变量才会存在于内存中,随着函数的退出而消失,这也就是为什么变量常常被称为automatic(自动变量)跟随别的语言中的叫法

Helping BIOSer become Awesome! 3088

kotlin实现ajax,Kotlin 语言中调用 JavaScript 方法实例详解

Kotlin 语言中调用 JavaScript 方法实例详解Kotlin 已被设计为能够与 Java 平台轻松互操作。它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类。但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型。你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotli...

weixin_32503361的博客 412

extern 和 external“C”的分析

extern 和 extern "C" 分析 extern extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字:它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误 2。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字

http://www.softwareace.cn 王牌软件 677

学习使用external的用法。

#include int a,b,c; void fun() { int a=2; c=a+b; } int main() { a=b=1; fun(); printf("c=%d\n",c); return 0; }

FunkyFrog821951259的博客 2500

使用python turtle画出一个钻戒

看了很多教程,画出的不同的图案,今天我在这里与大家分享一个使用python turtle画出一个钻戒。源代码如下:#引入小海龟模块 import turtle #设置画板的背景色 turtle.bgcolor("gray") #设置画板的背景图片 #turtle.bgpic(".../timg.gif") #设置小海龟画笔速度 turtle.speed(0) turtle.pensize(1) ...

kujirashark 8351

如何用代码画出一幅好看的画

随着计算机技术的逐步发展,借助计算机强大的能力进行绘画操作,已经变得非常容易。绘画作品的水平也是越来越高,下面就来看看用编程语言绘画,能搞出什么有意思的东西,相比人类的创作又有哪些值得我们思考的地方。more其实用代码直接绘制图形,还有很多其他方案。比如大名鼎鼎的 MATLAB ,可以创作出非常精良的数学几何图形。但是比较一下上面的这几种方案,可以说 AI 作画的水平,一下子提升了好几个层次。创作需要的输入越来越明确,越来越简答,越发的人性化。但是输出的内容,却越发的开始接近甚至超越了人类的水平。...

魔法小黑屋 2万+

给女朋友绘制一个戒指

想到我还没女朋友就好桑心,这节讲下怎么绘制一个戒指(圆环)圆环有两个属性,第一个是圆环的尺寸,第二个圆环的粗细(有点表达不清了=-=,就是环的半径以及圆的半径)vartorus= {geometry: {x:200,  // 环的半径y:20 // 圆的半径},position: {x: -100,y:80,z:100},rotation: {x:0,y:0,z:0},style: {color:

Fly to sky 501

程序员教你用代码手绘一只可爱的小狗,正好拿去送给女神给她个惊喜

不会画画?别担心,我来教你!

程序员青戈 1万+

python写情人节女朋友的EXCEL画像!

祝大家心想事成,永不被渣,得其所爱,幸福美满。 给大家准备了一份已经写好的代码,利用python+opencv+openpyxl,opencv实现读取图片像素颜色,然后openpyxl自动填充Excal表格对应单元格背景颜色,得到一副Excal填充图画。文末代码下载链接。 先来看看效果叭(gif动图)! (换成你女朋友的照片,效果会比二次元好很多,因为更加逼真了) 然后看代码叭!(兄弟们店点赞)。 配置环境 我们需要用到python以及openpyxl和opencv包,没有下载的小伙伴可以去配置一下,超级

周旋的博客 3139

matlab有趣表白程序_matlab情人节表白代码

【实例简介】情人节表白【实例截图】【核心代码】%构造体积方程和坐标轴,画出图形;[X,Y,Z] = meshgrid(linspace(-3,3,101));%3D心型图方程如下;F = -X.^2.*Z.^3-(9/80).*Y.^2.*Z.^3 (X.^2 (9/4).*Y.^2 Z.^2-1).^3;hFigure = figure;sz = get(hFigure, 'Position')...

weixin_39866867的博客 2819
上一篇: Kent Beck 教你编程模式与代码重构
下一篇: 画一个妹子陪着你 | 情人节特辑
肖小的人儿
博客等级 码龄12年 29粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值