当前位置: 首页 > news >正文

blender布阵

1、设计阵形

    # %% 圆环阵r_cir = 0.25  # 半径/mangles = 2 * np.pi / N * np.arange(N)ele_x = r_cir * np.cos(angles)ele_y = r_cir * np.sin(angles)Data3 = np.column_stack((ele_x, ele_y, np.full(N, z_distance)))

2、打开blender绘制阵形

# 打开Blender文件bpy.ops.wm.open_mainfile(filepath=blend_file_path)

3、创建发射器

   ##创建发射器################################# 示例:设置水平和垂直视角horizontal_angle = 2*sm1  # 水平视角,单位为度vertical_angle = 2*sm2  # 垂直视角,单位为度# 计算焦距和传感器尺寸focal_length, sensor_width, sensor_height = calculate_focal_length_and_sensor_size(horizontal_angle, vertical_angle)# 1. 创建发射器(相机)emitter_collection = create_collection("Emitter")bpy.ops.object.camera_add(location=(0, 0, 0))  # 起点位于原点emitter = bpy.context.objectemitter.name = "Emitter"# 隐藏相机的边框和相机图标emitter.hide_set(True)  # 在视图中隐藏对象emitter.hide_render = True  # 在渲染中隐藏对象emitter.hide_viewport = True  # 在视口中隐藏对象# 设置相机不参与渲染和碰撞检测emitter.cycles.is_visible_camera = Falseemitter.cycles.is_visible_diffuse = Falseemitter.cycles.is_visible_glossy = Falseemitter.cycles.is_visible_transmission = Falseemitter.cycles.is_visible_volume_scatter = False# 设置相机的焦距和传感器尺寸emitter.data.lens = focal_lengthemitter.data.sensor_width = sensor_widthemitter.data.sensor_height = sensor_heightprint(f"焦距: {focal_length} mm")print(f"传感器宽度: {sensor_width} mm")print(f"传感器高度: {sensor_height} mm")# 计算宽高比aspect_ratio = sensor_width / sensor_height# # 设置相机的宽高比# bpy.context.scene.render.resolution_x = 1920  # 假设水平分辨率# bpy.context.scene.render.resolution_y = int(1920 / aspect_ratio)  # 根据宽高比计算垂直分辨率# 计算在指定距离处的边框宽度和高度distance = -r_scanframe_width = distance * math.tan(horizontal_angle / 2)frame_height = distance * math.tan(vertical_angle / 2)# 计算四个角点的局部坐标half_width = frame_width / 2half_height = frame_height / 2corners_local = [(-half_width, -half_height, distance),(half_width, -half_height, distance),(half_width, half_height, distance),(-half_width, half_height, distance)]# 将局部坐标转换为世界坐标corners_world = []for corner in corners_local:world_corner = emitter.matrix_world @ Vector(corner)corners_world.append(world_corner)# 创建四条线连接相机起点和边框角点camera_location = emitter.locationfor i, corner in enumerate(corners_world):line_name = f"Line_{i}"create_line(camera_location, corner, line_name)# 假设 corners_world 是存储角点的列表num_corners = len(corners_world)for i in range(num_corners):start = corners_world[i]end = corners_world[(i + 1) % num_corners]line_name = f"Border_Line_{i}"create_line(start, end, line_name)

4、创建接收器:


#######创建接收器#######################################receiver_collection = create_collection("Receivers")receiver_material = bpy.data.materials.new(name="Receiver_Blue")receiver_material.diffuse_color = (1, 0, 0, 1)num_receivers = Nreceiver_z = 0  # 接收器平面高度receivers = []for i in range(num_receivers):angle = 2 * math.pi * i / num_receiversreceiver_x = Data3[i, 0]receiver_y = Data3[i, 1]receiver_z = z_distance# 创建接收器(位置抬高到Z=0.25)bpy.ops.mesh.primitive_cube_add(size=0.01, location=(receiver_x, receiver_y, receiver_z))receiver = bpy.context.objectreceiver.name = f"Receiver_{i}"receiver.data.materials.append(receiver_material)# 添加自定义属性receiver["is_receiver"] = Truereceiver["angle_deg"] = math.degrees(angle)receiver_collection.objects.link(receiver)# 对齐相机到接收器平面align_camera_to_plane(emitter, receiver_z=receiver_z)# 验证参数print(f"相机位置: {emitter.location}")print(f"相机旋转: {np.degrees(emitter.rotation_euler)} 度")print(f"镜头焦距: {emitter.data.lens:.2f} mm")

5、 保存blender:

    bpy.ops.wm.save_mainfile(filepath=blend_file_path)

6、 函数返回发射器、接收器的位置


文章转载自:

http://CrWBzv4H.nxtgb.cn
http://fbAvqPaT.nxtgb.cn
http://acoYHSK5.nxtgb.cn
http://E1Bri0Qw.nxtgb.cn
http://yLBPGmTN.nxtgb.cn
http://2UfqA9ij.nxtgb.cn
http://aE33gvMb.nxtgb.cn
http://yQCwz1gz.nxtgb.cn
http://QURizVFH.nxtgb.cn
http://siQJMBNi.nxtgb.cn
http://BXNIQktc.nxtgb.cn
http://Vah69nzO.nxtgb.cn
http://H0KL18WH.nxtgb.cn
http://wssRa9TY.nxtgb.cn
http://fdn2JFqX.nxtgb.cn
http://3w9WSIuH.nxtgb.cn
http://Z0w3y7Er.nxtgb.cn
http://GXow8B0X.nxtgb.cn
http://1Pvxv8z5.nxtgb.cn
http://CmwiKu2Y.nxtgb.cn
http://57JnW6PI.nxtgb.cn
http://R6UzA2EG.nxtgb.cn
http://DEB7kmDF.nxtgb.cn
http://7KAqXYOC.nxtgb.cn
http://aEnn2dZp.nxtgb.cn
http://qsYogmno.nxtgb.cn
http://TAAliDMd.nxtgb.cn
http://lFSZfpdy.nxtgb.cn
http://Q9D1mzmn.nxtgb.cn
http://y06Qwi7n.nxtgb.cn
http://www.dtcms.com/a/379718.html

相关文章:

  • HT8691:适配多元音频设备的高效D类音频功率放大器
  • 智能AI聊天系统的会话历史管理:从零到一的技术实现详解
  • 太阳辐射测量仪:精准捕捉太阳能量,赋能多领域科学研究与应用
  • Kubernetes 中运行 MongoDB:StatefulSet 与持久化存储配置
  • WebSocket实现点对点通信
  • Linux912 shell:$# $1 $?;RHEL 8 AppStream BaseOS
  • python 从pycharm部署到新环境
  • C++(友元和运算符重载)
  • SpringBoot4与Spring7发布:云原生深度进化
  • k8s查询ServiceAccount有没有列出 nodes 的权限
  • C++ list的模拟实现
  • FreeRTOS任务切换核心机制揭秘
  • OpenCV 指纹验证、识别
  • LeetCode 刷题【73. 矩阵置零】
  • Ubuntu 系统安装 Miniconda 完整方法与注意事项
  • 计算机视觉(opencv)实战十七——图像直方图均衡化
  • vue3 样式 css、less、scss、sass 的说明
  • CSS 中 white-space 用于控制元素内空白符(空格、制表符、换行符)的处理方式以及文本的换行行为
  • 少儿舞蹈小程序(14)在线预约
  • 【uniapp微信小程序】扫普通链接二维码打开小程序
  • 基于uni-app的蛋糕订购小程序的设计与实现(代码+数据库+LW)
  • 微服务保护和分布式事务
  • 线性代数 · 行列式 | Sarrus Rules / Laplace Expansion
  • uni小程序中使用Echarts图表
  • 小程序setNavigationBarColor设置背景渐变,图片渐变
  • OpenAI与微软“再造合作”:重组背后的资本与生态博弈
  • IP验证概述
  • 【RabbitMQ】高级特性:持久性·发送方确认·重试机制·TTL·死信队列·延迟队列·事务·消息分发
  • Cherry Studio递归工具调用机制深度解析
  • python+springboot大学生心理测评与分析系统 心理问卷测试 自动评分分析 可视化反馈系统