first version
This commit is contained in:
163
README.md
Normal file
163
README.md
Normal file
@@ -0,0 +1,163 @@
|
||||
# 目录结构说明
|
||||
|
||||
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"的场景,并附带一条消息。
|
||||
|
||||
Reference in New Issue
Block a user