164 lines
4.1 KiB
Markdown
164 lines
4.1 KiB
Markdown
# 目录结构说明
|
||
|
||
asset放一些学习资料,github仓库放不下就放到网盘中去。
|
||
|
||
plugin为自建的pymol的插件开发的一些代码
|
||
|
||
scripts为一些脚本文件,主要是测试代码
|
||
|
||
|
||
## pymol 资源学习绘图
|
||
|
||
[各种作用力绘图](https://proteintools.uni-bayreuth.de./)
|
||
|
||
|
||
## 环境安装
|
||
|
||
```shell
|
||
conda install -c conda-forge ffmpeg pymol-open-source biopython loguru
|
||
```
|
||
|
||
## 最高质量渲染
|
||
|
||
```shell
|
||
util.performance(0)
|
||
rebuild
|
||
```
|
||
|
||
|
||
PyMOL可以用多种方式进行录制:
|
||
|
||
1. **命令行录制**: 使用`log_open`和`log_close`命令,可以将PyMOL的命令行操作记录到文本文件。
|
||
|
||
```
|
||
cmd.log_open('filename.log')
|
||
... # Your operations
|
||
cmd.log_close()
|
||
```
|
||
|
||
2. **Ray Tracing**: 使用`ray`命令渲染高质量的图片,然后用其他软件将图片合成为视频。
|
||
|
||
3. **使用`mset`和`mview`创建动画**: 如你之前所述,通过这两个命令创建动画,然后使用`mpng`命令将动画导出为PNG帧,最后用其他软件将其合成为视频。
|
||
|
||
```
|
||
cmd.mpng('frame_prefix_', 1, 60)
|
||
```
|
||
|
||
4. **屏幕录制软件**: 使用外部屏幕录制软件(如OBS、Camtasia等)进行录制。
|
||
|
||
5. **PyMOL API和脚本**: 使用PyMOL的Python API和PyMOL脚本,可以更精细地控制录制内容。
|
||
|
||
## PyMOL工作目录
|
||
|
||
使用`cd`命令改变PyMOL的工作目录。例如:
|
||
|
||
```
|
||
cmd.cd("/path/to/new/directory")
|
||
```
|
||
|
||
## 图片渲染
|
||
|
||
设置600DPI:
|
||
|
||
```shell
|
||
width = int(1920 * (600 / 72))
|
||
height = int(1080 * (600 / 72))
|
||
cmd.ray(width, height)
|
||
```
|
||
|
||
|
||
|
||
得到帧1至帧60的PNG图片
|
||
|
||
```shell
|
||
cmd.mset("1 x60 61 x60")
|
||
cmd.scene('frame1', 'store')
|
||
cmd.mview('store', state=1, scene='frame1')
|
||
cmd.scene('frame2', 'store')
|
||
cmd.mview('store', state=60, scene='frame2')
|
||
cmd.mview('interpolate')
|
||
|
||
for i in range(1, 61):
|
||
cmd.frame(i)
|
||
cmd.ray(1920, 1080, 300)
|
||
cmd.mpng(f'frame_prefix_{i}.png')
|
||
```
|
||
|
||
|
||
|
||
```shell
|
||
from dataclasses import dataclass, field
|
||
from typing import Tuple
|
||
from pathlib import Path
|
||
|
||
@dataclass
|
||
class PyMOLAnimator:
|
||
resolution: Tuple[int, int] = (1920, 1080)
|
||
dpi: int = 300
|
||
frame_count: int = 120
|
||
output_dir: Path = field(default_factory=lambda: Path('./'))
|
||
|
||
def save_frames(self, scene_1: str, scene_2: str):
|
||
import pymol.cmd as cmd
|
||
|
||
# 设置动画帧数
|
||
cmd.mset(f"1 x{self.frame_count} {self.frame_count+1} x{self.frame_count}")
|
||
|
||
# 存储第一帧和最后一帧
|
||
cmd.scene(scene_1, 'store')
|
||
cmd.mview('store', state=1, scene=scene_1)
|
||
cmd.scene(scene_2, 'store')
|
||
cmd.mview('store', state=self.frame_count, scene=scene_2)
|
||
|
||
# 插值以创建动画
|
||
cmd.mview('interpolate')
|
||
|
||
output_path = self.output_dir / 'frame_prefix_'
|
||
|
||
# 保存每一帧为PNG图片
|
||
for i in range(1, self.frame_count+1):
|
||
cmd.frame(i)
|
||
cmd.ray(self.resolution[0], self.resolution[1], self.dpi)
|
||
cmd.mpng(str(output_path) + f'{i}.png')
|
||
|
||
# 使用
|
||
animator = PyMOLAnimator((1920, 1080), 300, 120, Path('/path/to/save'))
|
||
animator.save_frames('frame1', 'frame2')
|
||
|
||
```
|
||
|
||
## 场景设置
|
||
|
||
`cmd.mview`和`cmd.scene`两者都用于存储视图状态,但用途和范围有所不同:
|
||
|
||
### `cmd.mview`
|
||
|
||
- **主要用途**: 用于电影插值,在电影播放中创建平滑过渡。
|
||
|
||
- **存储内容**: 主要存储相机和对象矩阵,用于电影帧之间的插值。
|
||
|
||
- **特定于帧**: 可以为电影中的特定帧或帧范围存储视图。
|
||
|
||
- **动画专用**: 主要用于创建复杂的电影动画。
|
||
|
||
```
|
||
cmd.mview('store', state=1, scene='frame1')
|
||
```
|
||
|
||
这会在状态1下,用场景名`frame1`存储当前相机和对象矩阵。
|
||
|
||
### `cmd.scene`
|
||
|
||
- **主要用途**: 存储和恢复场景,方便用户随时回到特定的视图和设置。
|
||
|
||
- **存储内容**: 存储相机视图、所有对象的活动信息、所有原子的可见性和颜色、所有的表示形式和全局帧索引。
|
||
|
||
- **不特定于帧**: 主要用于一般目的的视图保存和恢复。
|
||
|
||
```
|
||
cmd.scene('MyScene', 'store', 'This is my special scene')
|
||
```
|
||
|
||
这会存储一个名为"MyScene"的场景,并附带一条消息。
|
||
|