Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1578|回复: 8

用python从头开发3d显示模块

[复制链接]

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
发表于 2023-7-18 22:50:28 | 显示全部楼层 |阅读模式
3d显示就是一个投影过程,就像照相机一样,把三维的坐标投影到二维的空间里。一般经过如下坐标变换
物体坐标系-->世界坐标系-->相机坐标系
转换的过程实际就是矩阵换算

实际操作的过程如下
1.用python显示一个多边形(三维物体都是一个个多边形组成的)
2.在世界坐标系定义一个标准的立方体
3.把这个立方体转换到摄像头坐标系
4.用python把这个立方体显示出来
回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-18 23:19:56 | 显示全部楼层
1.用python显示一个直线
  1. import cv2
  2. import numpy as np

  3. newImageInfo=(500,500,3) #定义图片的宽高信息
  4. x=100
  5. def disp():
  6.     global x
  7.     dst=np.zeros(newImageInfo,np.uint8)
  8.     #绘制线段
  9.     x=x+10
  10.     cv2.line(dst,(x,100),(400,400),(0,0,255))
  11.     '''line函数说明:第一个参数表示目标图片数据,
  12.     二表示线段起始位置,三表示终止位置,四表示线段的颜色'''
  13.     cv2.imshow('dst',dst)#展示绘制结果
  14.     cv2.waitKey(500)

  15. while 1:
  16.     disp()
复制代码
回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-18 23:27:19 | 显示全部楼层
2.旋转矩阵理论https://zhuanlan.zhihu.com/p/458827599
看这很吓人,实际只需要知道公式
$$\begin{bmatrix}X\\Y\\Z\end{bmatrix} = \lambda\boldsymbol{R}\begin{bmatrix}x\\y\\z\end{bmatrix}+\begin{bmatrix}\Delta X\\\Delta Y\\\Delta Z\end{bmatrix}$$
其中xyz是原坐标系坐标,XYZ是新坐标系坐标
可以看到旋转矩阵R是关键
求解步骤是
(1)先求$\lambda$
$$\lambda=\frac{\sqrt{\left(X_2-X_1\right)^2+\left(Y_2-Y_1\right)^2+\left(Z_2-Z_1\right)^2}}{\sqrt{\left(x_2-x_1\right)^2+\left(y_2-y_1\right)^2+\left(z_2-z_1\right)^2}}$$
(2)再求一个中间变量abc
$$
\begin{aligned}
&\text{.} A=\left[\begin{array}{ccc}0&-\lambda z_{21}-Z_{21}&-\lambda y_{21}-Y_{21}\\-\lambda z_{21}-Z_{21}&0&\lambda x_{21}+X_{21}\\\lambda y_{21}+Y_{21}&\lambda x_{21}+X_{21}&0\\\vdots&\vdots&\vdots\\0&-\lambda z_{n1}-Z_{n1}&-\lambda y_{n1}-Y_{n1}\\-\lambda z_{n1}-Z_{n1}&0&\lambda x_{n1}+X_{n1}\\\lambda y_{n1}+Y_{n1}&\lambda x_{n1}+X_{n1}&0\end{array}\right]  \\
&X=[a,b,c]^{\mathrm{T}} \\
&L=\quad[X_{21}-\lambda x_{21}\quad Y_{21}-\lambda y_{21}\quad Z_{21}-\lambda z_{21}\quad\cdots  \\
&X_{n1}-\lambda x_{n1}\quad Y_{n1}-\lambda y_{n1}\quad Z_{n1}-\lambda z_{n1}]^{\mathrm{T}} \\
&\text{按最小二乘法间接平差原理求解未知数:} \\
&X=\left(A^{\mathrm{T}}A\right)^{-1}A^{\mathrm{T}}L
\end{aligned}$$
(3)最后求R
$$R=\frac{1}{1+a^2+b^2+c^2}\begin{bmatrix}1+a^2-b^2-c^2&-2c-2ab&-2b+2ac\\2c-2ab&1-a^2+b^2-c^2&-2a-2bc\\2b+2ac&2a-2bc&1-a^2-b^2+c^2\end{bmatrix}$$



回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-18 23:53:39 | 显示全部楼层
规定点的存储方式为
  1. points_old = np.array ([[x1,y1,z1],[x2,y2,z2],...])
复制代码

(1)先求$\lambda$
$$\lambda=\frac{\sqrt{\left(X_2-X_1\right)^2+\left(Y_2-Y_1\right)^2+\left(Z_2-Z_1\right)^2}}{\sqrt{\left(x_2-x_1\right)^2+\left(y_2-y_1\right)^2+\left(z_2-z_1\right)^2}}$$
对应的代码为

  1. part_upper = np.sqrt(np.sum((points_new[1]-points_new[0])**2))
  2. part_down = np.sqrt(np.sum((points_old[1]-points_old[0])**2))
  3. lambda =part_upper/part_down
复制代码




回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-19 00:16:43 | 显示全部楼层
(2)再求A
先求
  1. points_dif_old = points_old[1:-1]-points_old[0]
  2. points_dif_new = points_new[1:-1]-points_new[0]
复制代码

  1. A= np.array([])
  2. for i in range(points_dif_old.shape()[0]):
  3.     A = np.append(A, [0, -lambda*points_dif_old[n][2]-points_dif_new[n][2],-lambda*points_dif_old[n][1]-points_dif_new[n][1]])
复制代码


回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-19 20:35:03 | 显示全部楼层
再求L
未完待续
回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-19 20:35:23 | 显示全部楼层
求得X
回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2023-7-19 20:35:36 | 显示全部楼层
最后求得
R
回复

使用道具 举报

374

主题

1167

帖子

3683

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3683
 楼主| 发表于 2024-5-29 16:26:53 | 显示全部楼层
任务1:显示一个3d的立方体
输入:三个点在两个坐标系中的坐标,以及立方体的8个点的坐标轴1中的坐标
输出:立方体的8个点的坐标轴2中的坐标
思路:利用  三个点在两个坐标系中的坐标,求lamda、R,获取转换关系
把8个点带入求解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2024-11-24 01:36 , Processed in 0.050771 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表