matplotlib.animation 3d姿態動畫

目錄

演示效果:

演示代碼:

保存為gif


演示效果:

演示代碼:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation# 定義人體關鍵點之間的連接關系
connections = [(0, 1),  # 頭部到頸部(1, 2), (2, 3), (3, 4),  # 右臂(1, 5), (5, 6), (6, 7),  # 左臂(1, 8),  # 頸部到身體中心(8, 9), (9, 10), (10, 11),  # 右腿(8, 12), (12, 13), (13, 14),  # 左腿(11, 15),  # 右腳到右腳尖(14, 16),  # 左腳到左腳尖
]map_boneInfo = {
# 骨骼名稱       父骨骼名稱        子骨骼名稱    序號       初始位置
"BoneRoot":   ["RootNode",     "",          0,        np.array([  0,  0,0])],
"Hip":        ["BoneRoot",     "",          1,        np.array([  0, 80,0])],
"r_hip":      ["Hip",          "r_knee",    2,        np.array([-10, 80,0])],
"r_knee":     ["r_hip",        "r_foot",    3,        np.array([-10, 40,0])],
"r_foot":     ["r_knee",       "",          4,        np.array([-10,  0,0])],
"l_hip":      ["Hip",          "l_knee",    5,        np.array([ 10, 80,0])],
"l_knee":     ["l_hip",        "l_foot",    6,        np.array([ 10, 40,0])],
"l_foot":     ["l_knee",       "",          7,        np.array([ 10,  0,0])],
"spine":      ["Hip",          "thorax",    8,        np.array([  0,110,0])],
"thorax":     ["spine",        "",          9,        np.array([  0,140,0])],
"neck":       ["thorax",       "head",     10,        np.array([  0,150,0])],
"head":       ["neck",         "",         11,        np.array([  0,160,0])],
"l_shoulder": ["thorax",       "l_elbow",  12,        np.array([ 15,140,0])],
"l_elbow":    ["l_shoulder",   "l_wrist",  13,        np.array([ 50,140,0])],
"l_wrist":    ["l_elbow",      "",         14,        np.array([ 85,140,0])],
"r_shoulder": ["thorax",       "r_elbow",  15,        np.array([-15,140,0])],
"r_elbow":    ["r_shoulder",   "r_wrist",  16,        np.array([-50,140,0])],
"r_wrist":    ["r_elbow",      "",         17,        np.array([-85,140,0])],
}init_poses=[]map_initTRS = {}
map_initTRS["BoneRoot"] = np.array([[0,0,0],[0,0,0],[1,1,1]],dtype=float)
for index,i in enumerate(map_boneInfo.keys()):if i == "BoneRoot":continuetrans = - map_boneInfo[i][3] + map_boneInfo[map_boneInfo[i][0]][3]init_poses.append(map_boneInfo[i][3]/60.0)rotate = [0,0,0]scale = [1,1,1]map_initTRS[i] = np.array([trans, rotate, scale], dtype=float)# 更新姿態以模擬行走動作
def update_pose(frame, pose, lines):# 在x軸上前進,并在y軸上輕微左右擺動以模擬行走的平衡動作pose[:, 0] += 0.01  # 向前移動pose[:, 1] =pose[:, 1]+ np.sin(frame / 10.0) * 0.02  # 左右擺動# 更新線段以連接關鍵點for line, (i, j) in zip(lines, connections):line.set_data([pose[i, 0], pose[j, 0]], [pose[i, 1], pose[j, 1]])line.set_3d_properties([pose[i, 2], pose[j, 2]])return lines# 創建動畫
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')# 設置坐標軸的顯示范圍
ax.set_xlim((0, 5))
ax.set_ylim((-1, 1))
ax.set_zlim((0, 3))def init_pose():pose = np.zeros((17, 3))  # 17個關鍵點,每個有x, y, z坐標# 設置頭部和頸部位置pose[0, 2], pose[1, 2] = 1.8, 1.6  # z軸上的高度# 設置右臂位置(水平伸展)pose[2, :] = [0, -0.3, 1.5]  # 右肩pose[3, :] = [0, -0.7, 1.5]  # 右肘pose[4, :] = [0, -1.0, 1.5]  # 右手# 設置左臂位置(水平伸展)pose[5, :] = [0, 0.3, 1.5]  # 左肩pose[6, :] = [0, 0.7, 1.5]  # 左肘pose[7, :] = [0, 1.0, 1.5]  # 左手# 設置軀干中心位置pose[8, 2] = 1.2  # z軸上的高度# 設置腿部位置(站立)pose[9, :] = [0, -0.2, 1.0]  # 右髖pose[10, :] = [0, -0.2, 0.2]  # 右膝pose[11, :] = [0, -0.2, -0.5]  # 右腳pose[12, :] = [0, 0.2, 1.0]  # 左髖pose[13, :] = [0, 0.2, 0.2]  # 左膝pose[14, :] = [0, 0.2, -0.5]  # 左腳# 腳尖位置(在T姿勢中通常不需要特別調整)pose[15, :] = [0, -0.2, -1]  # 右腳尖pose[16, :] = [0, 0.2, -1]  # 左腳尖return pose# pose = np.asarray(init_poses).astype(np.float32)
pose = init_pose()
lines = [ax.plot([pose[s, 0], pose[e, 0]], [pose[s, 1], pose[e, 1]], [pose[s, 2], pose[e, 2]])[0] for s, e in connections]ani = FuncAnimation(fig, update_pose, frames=np.arange(0, 200), fargs=(pose, lines), interval=50)plt.show()

保存為gif

ani.save('1111.gif', writer='pillow', fps=60)writergif = animation.PillowWriter(fps=30)
ani.save('2222.gif', writer = writergif)
plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【c++入門】純粹的五位偶數

說明 純粹偶數指的是一個數的各個位都是偶數的數,比如:24686;請編程求出10000~n中,所有的五位的純粹偶數有多少個? 輸入數據 一個整數n(n為一個5位的整數) 輸出數據 一個整數,代…

網絡防御第6次作業

防病毒網關 按照傳播方式分類 病毒 病毒是一種基于硬件和操作系統的程序,具有感染和破壞能力,這與病毒程序的結構有關。病毒攻擊的宿主程序是病毒的棲身地,它是病毒傳播的目的地,又是下一次感染的出發點。計算機病毒感染的一般過…

Java基礎 - Stream 流:Stream API的中間操作

在上一篇博客中,我介紹了構建 Stream 流的多種方式,以及 Stream 流的特點和優勢。如果你還沒有閱讀,你可以點擊這里查看。 Java基礎 - Stream 流:構建流的多種方式 在這篇博客中,我將探索 Stream API 的中間操作&…

動態規劃(算法競賽、藍橋杯)--分組背包DP

1、B站視頻鏈接&#xff1a;E16 背包DP 分組背包_嗶哩嗶哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i組第j個物品的體積 s[i]:第i組物品的個數 int f[N][N]; // f[i,j]:前i組物品&#xff0c;能放…

學習JavaEE的日子 Day21 枚舉

Day21 1.枚舉的引入 需求&#xff1a;編寫季節類&#xff08;Season&#xff09;&#xff0c;該類只有四個對象&#xff08;spring&#xff0c;summer&#xff0c;autumn&#xff0c;winter&#xff09; 概念&#xff1a;枚舉&#xff08;enum&#xff09;全稱為 enumeration&…

基帶信號處理設計原理圖:2-基于6U VPX的雙TMS320C6678+Xilinx FPGA K7 XC7K420T的圖像信號處理板

基于6U VPX的雙TMS320C6678Xilinx FPGA K7 XC7K420T的圖像信號處理板 綜合圖像處理硬件平臺包括圖像信號處理板2塊&#xff0c;視頻處理板1塊&#xff0c;主控板1塊&#xff0c;電源板1塊&#xff0c;VPX背板1塊。 一、板卡概述 圖像信號處理板包括2片TI 多核DSP處理…

Linux進程管理:(二)進程調度原語

文章說明&#xff1a; Linux內核版本&#xff1a;5.0 架構&#xff1a;ARM64 參考資料及圖片來源&#xff1a;《奔跑吧Linux內核》 Linux 5.0內核源碼注釋倉庫地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 進程調度的概念比較簡單&#xff0c…

Java學習筆記NO.17

T1&#xff1a;合并兩個排序好的整數數組 import java.util.Arrays;public class MergeSortedArrays {public static int[] mergeArrays(int[] arr1, int[] arr2) {int[] result new int[arr1.length arr2.length];int i 0, j 0, k 0;while (i < arr1.length &&am…

一個簡單的iOS天氣應用程序源碼

創建一個簡單的iOS天氣應用程序涉及到多個步驟&#xff0c;包括設置項目、編寫代碼和使用外部API。由于篇幅限制&#xff0c;我將提供一個基礎的示例&#xff0c;這個例子會展示如何創建一個簡單的UI&#xff0c;獲取用戶的當前位置&#xff0c;并從OpenWeatherMap API獲取天氣…

QPS 提升 10 倍!滴滴借助 StarRocks 物化視圖實現低成本精確去重

作者&#xff1a;滴滴 OLAP 開發工程師 劉雨飛 小編導讀&#xff1a; 滴滴于 2022 年引入了 StarRocks。經過一年多的努力&#xff0c;StarRocks 逐漸替代了原有技術棧&#xff0c;成為滴滴內部主要的 OLAP 引擎。截至 2023 年 12 月&#xff0c;滴滴已經成功建立了超過 40 個 …

Cesium插件系列——3dtiles壓平

本系列為自己基于cesium寫的一套插件具體實現。 這里是根據Cesium提供的CustomShader來實現的。 在CustomShader的vertexShaderText里&#xff0c;需要定義vertexMain函數&#xff0c;例如下&#xff1a; struct VertexInput {Attributes attributes;FeatureIds featureIds;…

LVGL常用部件使用總結之圖片部件

圖片部件可用于顯示圖片&#xff0c;圖片源可以是 C 語言數組格式的文件、二進制的.bin 文件以及圖標字體。值得注意的是&#xff0c;圖片部件要顯示 BMP、JPEG 等格式的圖片&#xff0c;則必須經過解碼。 圖片部件的組成部分僅有一個&#xff1a;主體&#xff08;LV_PART_MAIN…

URI到底是個啥

URI是統一資源標識符&#xff08;Uniform Resource Identifier&#xff09;&#xff0c;URL是統一資源定位符&#xff08;Uniform Resource Locator&#xff09;。 具體如何標記和區分服務器上的資源用的其實就是URI&#xff0c;因為其經常出現在瀏覽器的地址欄里&#xff0c;…

Verilog(未完待續)

Verilog教程 這個教程寫的很好&#xff0c;可以多看看。本篇還沒整理完。 一、Verilog簡介 什么是FPGA&#xff1f;一種可通過編程來修改其邏輯功能的數字集成電路&#xff08;芯片&#xff09; 與單片機的區別&#xff1f;對單片機編程并不改變其地電路的內部結構&#xff0…

Parallel Computing - 一文講懂并行計算

目錄 Throughput/LatencySerial ComputingParallel ComputingTypes of parallel computersSimple 4-width SIMDAmdahls lawTypes of parallelism**Data Parallel Model**Task parallel PartitioningDomain DecompositionFunctional Decomposition CommunicationsExample that d…

java調用chatgpt接口,實現專屬于自己的人工智能助手

文章目錄 前言導包基本說明請求參數響應參數創建請求和響應的VO類 代碼編寫使用最后說明 前言 今天突然突發奇想&#xff0c;就想要用java來調用chatget的接口&#xff0c;實現自己的聊天機器人&#xff0c;但是網上找文章&#xff0c;屬實是少的可憐(可能是不讓發吧)。找到了…

ESP32 web 對接華為云平臺--MQTT協議

文章目錄 前言一、MQTT協議二、如何使用MQTT協議對接華為云1.注冊華為云賬號2.設備接入中創建資源空間3.如何連接4.通過MQTT.fx工具做初步對接4.1 設置連接信息4.2 連接平臺 5.查看平臺設備信息 三. 設備測對接平臺1.ESP測引入MQTT庫2.編碼2.1前端編碼修改2.2 后端接口修改 3.M…

element-plus+vue3表單含圖片(可預覽)(線上圖片)

一、要實現的效果&#xff1a; 二、如果期間出現這樣的效果&#xff08;表格穿透過來了&#xff09;&#xff0c;加上了這行代碼就可以了&#xff1a; preview-teleported“true” 如果僅測試用&#xff0c;建議使用線上圖片鏈接的形式&#xff0c;免得本地地址不生效&#xf…

SSH 的兩種認證方式

SSH&#xff08;Secure Shell&#xff09;提供了幾種不同的認證方式&#xff0c;其中兩種最常見的方式是密碼認證和密鑰認證。以下是它們的詳細介紹&#xff1a; 密碼認證&#xff1a; 原理&#xff1a;用戶在連接時輸入用戶名和密碼&#xff0c;然后將密碼傳輸到遠程服務器進行…

數學實驗-Matlab使用(1)

使用方法以及筆記均在文件中 class1_func1.m function f class1_func1(x) % f為輸出&#xff0c;輸出有多個時需要用中括號以矩陣的方式包起來 % x為輸入f sin(x)class1_func2.m function [a,b,u,v] class1_func2(x,y)[a,b] eig(x)[u,v] eig(y)class1.m % 當語句后有…