Files
BlueRoseNote/07-Other/AI/AI Agent/WY/Website/Netease AITA AssetMaker.md

29 KiB
Raw Blame History

提示词

请你说中文,并使用中文编写文档。

我需要你发挥卓越的前端开发能力,对我指定的网站进行全方位的“像素级复刻”。这个复刻不仅包括静态页面的排版、配色和字体,还需要涵盖所有的交互细节、动画效果和响应式适配。我们将使用 Vue 3 框架和 Vite 构建工具。

我想制作一个AI 提示词 => 2D原画 => 参考图 => 3D模型生成的WorkFlow网站功能与风格样式进行像素级复刻

迭代方式

  1. 你可以使用浏览器打开这个网站,我会帮你登录。
  2. 依次打开左边侧边按钮读取各个页面的HTML结构、CSS信息。将截图存储在Screenshots使用中文名。视频在github上寻找合适工具给我下载下来作为参考。
  3. 下载网站都用的图片的,并在复刻网站时用上。
  4. 搭建完前后端基础代码之后,先进行前端框架与效果迭代,之后反复对照截图、原始站点进行迭代,保证网站与原站点效果完全一致。
  5. 使用ObsidianCli 维护docs下的文档。

主要功能

  1. 该网站的主要功能是通过一套完整流程来生成3D模型大致流程如下
    1. 用户输入的参考图与提示来生成模型原画。
    2. 通过原画生成三视图。
    3. 使用三视图来生成3D模型。
    4. 3DMesh重拓扑。
    5. UV Unwrap
    6. auto texture
  2. 具备3D渲染功能请根据参考原站点使用方案。
  3. 具备节点工作流,请使用合适的节点框架,可以考虑使用 https://github.com/comfy-org/ComfyUI 中的节点渲染与流程控制逻辑。
    1. 节点工作在线共同预览与编辑功能,实现协同工作。
  4. 简单的账户登录机制, 并且提供OpenID登录方式。

技术选型

我打算使用: 前端技术TypeScript、Vue 3、Vite前端组件请使用Element Plus使用pnpm install element-plus 进行安装。 后端技术nodejs、Fastify、Mongoose、fastify-jwt 数据库MongoDB、MySQL。 工具函数Axios、VueUse、pnpm 文档管理Obsidian Cli

文档目录结构

  • docs
    • Netease_AITA_AssetMaker.md项目技术、设计细节入口文档方便Agent来寻找
    • Screenshots存放截图。
    • Videos视频参考。
    • WebsiteSource存放HTML、CSS相关信息。
    • Web前端相关文档。
    • Server后端相关文档。

复刻流程提示词

0. 准备阶段:安装必要 Skills (工具)

为了精准地感知和复刻目标网站,请优先完成以下工具的安装和配置。如果尚未安装,请在本地环境中执行相关命令:

  1. 视觉感知工具 (视觉分析核心)

    • Skill (依赖): playwright (用于 headless 浏览器截图、DOM 分析)
    • 安装命令: npm install playwright && npx playwright install
  2. 资源处理工具 (资产抓取核心)

    • Skill (依赖): axios, mime-types (用于下载图片、字体)
    • 安装命令: npm install axios mime-types
  3. 开发工具 (Vue 3 + Vite)

    • Skill (依赖): @vitejs/plugin-vue (如果在 Vite 项目中未配置)

1. 执行阶段:网站复刻工作流

请按照以下详细步骤执行任务。每完成一步,请向我反馈进度。

目标网站 URL: [在此处替换为您要复刻的网站 URL例如https://example.com]

第一步:全面观察与分析 (Observation)

  1. 高清截图: 使用 Playwright 对目标网站进行全长Full Page高清截图。同时抓取以下状态的截图
    • 特定组件(如 Button, Nav ItemHover 状态。
    • 移动端(如 iPhone 12 Pro的截图。
  2. 配色提取: 分析截图,生成一份完整的 JSON 格式色板Palette包括主色、辅助色、文本色、背景色、边框色以及渐变色参数。
  3. 字体分析: 确定目标网站使用的主要 WebFonts、字体大小Font Size、行高Line Height和字重Font Weight
  4. 结构分析: 使用 Playwright 导出核心 DOM 树的计算后样式Computed Styles特别是关键组件的 padding, margin, display (Flex/Grid) 属性和 border-radius

第二步:静态资源抓取 (Asset Collection)

  1. 文件下载: 自动下载目标网站的所有:
    • SVG 图标
    • 图片资源PNG/JPEG/WEBP
    • 字体文件WOFF2/WOFF
  2. 目录整理: 将下载的资产按照以下结构有序存入您的项目目录中(例如:src/assets/images, src/assets/icons, src/assets/fonts)。

第三步:代码生成 (Vue 3 Component Generation)

  1. 项目脚手架: 如果尚未在当前目录创建 Vite + Vue 3 项目,请创建一个:npm init vite@latest . -- --template vue
  2. 组件拆解: 将目标网页拆解为可复用的 Vue 组件(例如:Header.vue, HeroSection.vue, Card.vue, Footer.vue)。
  3. 样式复刻 (全都要):
    • 使用全局样式文件(如 src/style.css)定义色板变量和字体定义。
    • 在 Vue 组件中,使用 <style scoped> 编写 完全一致 的 CSS 样式。必须精确还原计算后的数值,不要估算。
    • 使用原生 CSS Flexbox 和 Grid 进行布局还原。

第四步:动画与交互复刻 (Interaction & Animation)

  1. 动态特效: 分析目标网站的关键动画例如页面滚动时的元素渐现、Header 缩放、Hover 时的微动效)。
    • 使用 CSS Transitions/Animations 或 Vue 3 的 <Transition> 组件精准还原。
    • 尽可能复刻其 cubic-bezier 缓动曲线和持续时间Duration
  2. 交互状态: 确保所有按钮、链接在 HoverActive 状态下的像素细节与原站一致。

第五步:自我校对 (Self-Correction)

  1. 组件预览: 完成关键组件后,启动 Vite 开发服务器(npm run dev)。
  2. 视觉比对: 将您生成的页面截图与原站截图进行叠加比对,特别注意边距和字体的偏差。
  3. 代码清理: 删除不必要的脚手架代码(如 Vite 默认的 HelloWorld 组件)。

2. 最终输出物

  1. 一个完整的、结构清晰的 Vue 3 + Vite 项目代码库。
  2. 在当前目录中可以成功运行 (npm run dev)。
  3. 生成的页面在视觉和交互上与目标网站达到 95% 以上的像素级匹配度。

现在,请开始按照工作流执行。如果有任何步骤遇到困难,或者需要我提供更具体的指令,请立即告知。

操作说明

  1. 在首页的Drop your concept art here可以使用拖拽或点击的方式上传模型的参考图。此时该区域会显示当前上传的图片。
  2. 点击下面的Clear清除图片点击Generate 3D开始3D模型生成流程。按钮会显示成Generating,之后切换到Workflow页面。./docs/screenshots/workflow/Workflow_使用单张图片生成参考图与三视图_1.png
  3. Workflow界面主要由白板与节点系统构成。
    1. SourceImage节点
      1. Inputs为输入图片
      2. auto pipeline为是否进行自动流程即 输入图片=> 参考图=> 三视图 => 3D模型 流程。
      3. AllowedModel为流程使用的模型设置。
    2. Pose节点
      1. 用于控制输出参考图的Pose。
      2. 节点Transform to Pose即可进行图片生成。

任务:

  1. 你帮我实现以上操作逻辑。
  2. 实现Workflow页面的中的白板与节点功能参考原始页面。
  3. 在后端实现AI服务接口。
    1. 可以接入Workflow中的AI服务查询各个服务商的文档
    2. 可以通过Netease AIGW接入AI服务。
      1. 参考以下网站,网站需要认证,打开浏览器,我来帮你登录。
      2. https://aigw.doc.nie.netease.com/21_%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/10_%E5%9F%BA%E6%9C%AC%E8%AF%B4%E6%98%8E/1_%E5%9F%BA%E6%9C%AC%E8%AF%B4%E6%98%8E.html
      3. https://aigw.doc.nie.netease.com/21_%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/11_%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81/2_%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81.html
      4. https://aigw.doc.nie.netease.com/21_%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/14_%E8%AE%A4%E8%AF%81%E4%B8%8E%E7%AE%A1%E7%90%86/%E8%AE%A4%E8%AF%81%E4%B8%8E%E7%AE%A1%E7%90%86.html
      5. https://aigw.doc.nie.netease.com/25_AIGW%E5%8A%9F%E8%83%BD%E6%8C%87%E5%8D%97/10_API%E6%8E%A5%E5%8F%A3.html
      6. https://aigw.doc.nie.netease.com/50_FAQ/2_API%E6%8A%A5%E9%94%99.html
    3. 可以通过 https://openai.nie.netease.com 的OpenAI、Claude样式的接口来接入服务需要用户提供AUTH_TOKEN)
  4. WorkFlow中存放一些Workflows里面有当前工作流信息你可以参考 https://app.assethub.io/workflow/10757
    1. 生成完模型后点击模型节点的View 3D Mesh就切换页面在页面中载入3D模型且模型带有贴图使用PBR光照模型进行渲染。

  1. 使用ObsidianCli 维护docs下的文档。

主要功能

  1. 该网站的主要功能是通过一套完整流程来生成3D模型大致流程如下
    1. 用户输入的参考图与提示来生成模型原画。
    2. 通过原画生成三视图。
    3. 使用三视图来生成3D模型。
    4. 3DMesh重拓扑。
    5. UV Unwrap
    6. auto texture
  2. 具备3D渲染功能请根据参考原站点使用方案。
  3. 具备节点工作流,请使用合适的节点框架,可以考虑使用 https://github.com/comfy-org/ComfyUI 中的节点渲染与流程控制逻辑。
    1. 节点工作在线共同预览与编辑功能,实现协同工作。
  4. 简单的账户登录机制, 并且提供OpenID登录方式。

技术选型

我打算使用: 前端技术TypeScript、Vue 3、Vite前端组件请使用Element Plus使用pnpm install element-plus 进行安装。 后端技术nodejs、Fastify、Mongoose、fastify-jwt 数据库MongoDB、MySQL。 工具函数Axios、VueUse、pnpm 文档管理Obsidian Cli

文档目录结构

  • docs
    • Netease_AITA_AssetMaker.md项目技术、设计细节入口文档方便Agent来寻找
    • Screenshots存放截图。
    • Videos视频参考。
    • WebsiteSource存放HTML、CSS相关信息。
    • Web前端相关文档。
    • Server后端相关文档。

以上作废

提示词

请你说中文,并使用中文编写文档。

需求

  1. 开发要求
    1. 在保证相关接口不变的情况下,重构./backend 中的服务端。
    2. 根据需求迭代./frontend 中的前端。
      1. .\frontend\src\features\workflow-editor 是WorkFlow节点面板不需要进行任何修复这个是其他人开发的但需要分析好接口主要有WorkFlow序列化/反序列化、所有节点序列化/反序列化、同步信息等。
  2. 鉴权
    1. 简单账号密码登录预留OIDC登录相关接口。
    2. 登录页面,需要截图参考。
  3. 工作区(WorkSpace) WorkFlow 序列化 & 同步。
    1. WorkSpace
      1. 每个用户可能拥有多个WorkSpace每个Workspace拥有多个WorkFlow。
    2. WorkFlow
      1. WorkFlow 流水线线号码、名称、工作流状态(原话设定、三视图、模型生成……)、创建人、参与人员
      2. 节点相关信息
        1. 节点公共信息Position、折叠等。
        2. 节点特有信息。
        3. 同事导出了一份分析报告./docs/web/workflow-node-panel-guide.md你可以参考一下。
  4. 资产库
    1. 相关资产的对象存储。各种图片、模型。
    2. 可以针对通过标签 过滤显示不同类型的资产。
    3. 可以根据文件名、WorkSpace、WorkFlow名进行检索。
    4. 在资产库点击项可以进行资产预览,模型、图片。
  5. 任务排队系统
    1. 根据节点使用AI API的情况AIGW、管理员设置的第三方AI API、用户设置自己的AI API将任务分配对对应的任务池。
    2. 构建一个Worker Pool每个WorkFlow使用一个主worker进行管理。
      1. WorkFlow执行相关
        1. 哪些节点是可以并行执行的?哪些节点是串行执行的?
        2. WorkFlow的执行状态原话设定、三视图、模型生成、模型拆分、模型组装等这些状态可以在管理员后台进行添加与定制。
        3. 分配SubWorker来执行节点定义的操作。执行完之后将相关信息返回给主Worker并将信息写入数据库资产写对象存储服务并将资产信息写入数据库中。
      2. 每个节点的执行状态。(待命、执行中、执行成功、执行失败)
    3. 管理员后台可以看到各个类型任务的排队情况。
  6. AI API & 计费系统
    1. 接入各种外部供应商API提供各种模型、URL管理员与用户只需要提供API Key或者API Token就可以完成配置。
    2. Netease AIGW 参考 后续章节 AIGW文档。
    3. 在用户设置页面添加AI API、Netease AIGW设置页面、以及 剩余积分 / 总共积分。
    4. 实现可配置的计费系统。
      1. 用户使用管理员配置的AI API就需要计算费用。
      2. 在管理员的管理后台可以设置AI API的积分方式。
      3. 第三方 AI服务商的API根据他们的文档信息设置计算方法。
      4. AIGW相关费用计算参考 Netease AIGW 文档。
  7. 部署方式与信息
    1. VPS SSH的方式信息之后再填写。
    2. 采用Docker Compose以容器的方式部署。
    3. 对象存储采用采用公司的S3对象存储服务具体信息之后填写。
    4. 数据库先采用VPS Docker部署的 之后会迁移到公司提供的云数据库服务。

技术选型

前端技术:沿用现有技术框架。 后端技术nodejs、Fastify、Mongoose、fastify-jwt 数据库MongoDB帮我确定是否有必要干掉SQL服务器 工具函数Axios、pnpm 工程文档管理Obsidian Cli

文档目录结构

  • docs
    • Netease_AITA_AssetMaker.md项目技术、设计细节入口文档方便Agent来寻找
    • Screenshots存放截图。
    • Web前端相关文档。
    • Server后端相关文档。

其他

Netease OIDC信息

client id 4884b03e951711f0ad370242ac120002
client secret f2862b8c5ab24085ab0883d119b631604884b354951711f0ad370242ac120002

OIDC 参考代码

#coding:UTF-8
"""
Requirements:
    1. Flask >= 0.10.1
    2. requests
    3. jwkest >= 1.1.7

Usage:
    python oidc_code_demo.py -H {listen_address} -p {listen_port}

Help:
    python oidc_code_demo.py -h
"""
import os
import uuid
from hashlib import md5
import datetime
from urllib import urlencode
import json
import requests
from flask import Flask, request, jsonify, session, redirect

from jwkest.jwk import SYMKey
from jwkest.jws import JWS
from jwkest.jwk import load_jwks_from_url
from jwkest.jws import NoSuitableSigningKeys

__revision__ = "0.01"
__author__ = "chenxs@corp.netease.com"

OIDC_CLIENT_ID = ""
OIDC_CLIENT_SECRET = ""
OIDC_PROVIDER = "https://login.netease.com/connect"
OIDC_AUTHORIZATION_SERVER = "https://login.netease.com/connect/authorize"
OIDC_TOKEN_ENDPOINT = "https://login.netease.com/connect/token"
OIDC_USERINFO_ENDPOINT = "https://login.netease.com/connect/userinfo"
OIDC_SCOPE = "openid nickname email fullname dep title empno"
OIDC_REDIRECT_URI = "https://127.0.0.1:5000/finish"
OIDC_JWKS_URI = "https://login.netease.com/connect/jwks"
OIDC_ALG = "HS256"

PYTHON_OIDC_DEMO = Flask(__name__)

@PYTHON_OIDC_DEMO.route("/", methods=['GET'])
def index():
    """index"""
    if 'username' in session:
        body = (
            u"</br><h2>OpenID Connect 鐧诲綍鎴愬姛銆<E5A79B></h2></br>"
            u"鎮ㄧ殑鐢ㄦ埛鍚嶆槸锛<E6A7B8>%s</br>"
            u"鎮ㄧ殑鍏ㄥ悕鏄細%s</br>"
            u"鎮ㄧ殑閭鏄細%s</br>"
            u"鎮ㄧ殑鑱屼綅鏄細%s</br>"
            u"鎮ㄧ殑閮ㄩ棬鏄細%s</br>"
            u"鎮ㄧ殑宸ュ彿鏄細%s</br>") % (
                session['username'], session.get('fullname', ''),
                session.get('email', ''), session.get('title', ''),
                session.get('dep', ''), session.get('empno', ''))
        body += u"<a href='/login'>鎴虫垜閲嶆柊鐧诲綍</a>"
        return body
    else:
        return u"<a href='/login'>鎴虫垜鐧诲綍</a>"

@PYTHON_OIDC_DEMO.route("/login", methods=['GET'])
def login():
    """AuthN Request"""
    session.clear()
    now = datetime.datetime.now().strftime("%s")
    session['uid'] = uuid.uuid4().hex
    session['state'] = session['uid']
    session['nonce'] = md5(session['uid'] + now).hexdigest()

    authn_request_params = {
        'response_type': 'code',
        'client_id': OIDC_CLIENT_ID,
        'state': session['state'],
        'nonce': session['nonce'],
        'scope': OIDC_SCOPE,
        'redirect_uri': OIDC_REDIRECT_URI,
        #'prompt': 'login',
        'display': 'touch',
    }

    redirect_url = "?".join([
        OIDC_AUTHORIZATION_SERVER, urlencode(authn_request_params)])

    return redirect(redirect_url)


def token_request(code):
    """2. Token Request"""
    params = {
        'grant_type': 'authorization_code',
        'code': code,
        'redirect_uri': OIDC_REDIRECT_URI,
        'client_id': OIDC_CLIENT_ID,
        'client_secret': OIDC_CLIENT_SECRET,
    }
    _resp = requests.post(OIDC_TOKEN_ENDPOINT, data=params)
    return json.loads(_resp.text)

def id_token_verify(id_token, nonce=None):
    """3. id token verify"""

    now = int(datetime.datetime.now().strftime("%s"))
    if OIDC_ALG == "HS256":
        signed_keys = [SYMKey(key=OIDC_CLIENT_SECRET)]
    else:
        signed_keys = load_jwks_from_url(OIDC_JWKS_URI)

    try:
        plain_id_token = JWS().verify_compact(id_token, signed_keys)
    except NoSuitableSigningKeys:
        # logger the id_token please
        return {'error': 'can not verify the id token'}

    print "idtoken: %s" % plain_id_token
    if nonce:
        if (not plain_id_token.has_key('nonce')) or (
                plain_id_token['nonce'] != nonce):
            return {'error': 'id token nonce not correct'}
    if plain_id_token['iss'] != OIDC_PROVIDER:
        return {'error': 'id token iss not correct'}
    if plain_id_token['aud'] != OIDC_CLIENT_ID:
        return {'error': 'id token aud not correct'}
    if now >= int(plain_id_token['exp']):
        return {'error': 'id token expired'}

    return {'id_token': plain_id_token}


@PYTHON_OIDC_DEMO.route("/finish", methods=['GET'])
def finish():
    """
    1. AuthN Response
    2. Token Request
    3. id token verify
    4. userinfo request
    5. login user
    """

    # 1. AuthN Response
    try:
        code = request.args.get('code')
        if session['state']:
            state = request.args.get('state')
            if state != session['state']:
                return u"闈炴硶璇锋眰"
    except ValueError:
        return u"闈炴硶璇锋眰"
    # 2. Token Request
    token = token_request(code)
    print "token: %s" % token
    if token.has_key('error'):
        return u"鍑洪敊浜嗭細%s" % str(token)
    # 3. id token verify
    id_token_verified = id_token_verify(token['id_token'])
    if id_token_verified.has_key('error'):
        return id_token_verified['error']
    else:
        id_token = id_token_verified['id_token']

    print "id_token: %s" % id_token

    # 4. userinfo request
    _req_session = requests.Session()
    _req_session.headers.update({
        "Authorization": "Bearer %s" % token['access_token']})
    userinfo_req = _req_session.get(OIDC_USERINFO_ENDPOINT)
    userinfo = json.loads(userinfo_req.text)
    # login the user
    session['username'] = userinfo['nickname']
    session['email'] = userinfo['email']
    session['title'] = userinfo.get('title', '')
    session['empno'] = userinfo.get('empno', '')
    session['dep'] = userinfo.get('dep', '')
    session['fullname'] = userinfo.get('fullname', '')
    return redirect("/")

if __name__ == "__main__":
    import sys
    import argparse
    parser = argparse.ArgumentParser(
        usage='%(prog)s [options]', version='%(prog)s ' + str(__revision__))
    parser.add_argument(
        '-H', '--host', dest='host', type=str,
        help="Specify listening adress, default is 127.0.0.1")
    parser.add_argument(
        '-p', '--port', dest='port', type=int,
        help="Specify listening port, default is 5000")
    parser.add_argument(
        '-c', '--client_id', dest='client_id', type=str,
        help="oidc client_id is required.")
    parser.add_argument(
        '-s', '--client_secret', dest='client_secret', type=str,
        help="oidc client_secret is required.")

    args = parser.parse_args()

    host = args.host or '127.0.0.1'
    port = args.port or 5000
    OIDC_REDIRECT_URI = "http://%s:%s/finish" % (host, port)
    OIDC_CLIENT_ID = args.client_id
    OIDC_CLIENT_SECRET = args.client_secret
    if not OIDC_CLIENT_ID or not OIDC_CLIENT_SECRET:
        parser.print_help()
        parser.exit()

    PYTHON_OIDC_DEMO.secret_key = "this is a random secret"
    PYTHON_OIDC_DEMO.debug = True
    PYTHON_OIDC_DEMO.run(host=host, port=port)

AI模型

流程常用的AI模型 VLM-Gemini+WD14反推2D-liblib+nanobananapro3D-Tripo P1UV-HunyuanCDN-Filepickerseedream4.5/5.0 和 Tripo / Meshy / Hunyuan/ Rodin / HItem3D

其他AI API 提供商

你通过google搜索以及其他搜索SKill帮我收集信息。

  • 字节 火山引擎、seedream、seeddance
  • 腾讯 混元
  • Google Gemini
  • Chatgpt
  • Tripo
  • 阿里千问

AIGW文档

  • https://aigw.doc.nie.netease.com/ 请打开浏览器进行阅读1.5~1.9章节,该网站需要登录,我会帮你登录,登录完会和你说我已经登录了。

支持的模型参考:

将相关信息放到./docs/AIProvider 下,并且编写文档。

部署

将服务部署到VPS上使用Docker Compose进行部署。部署前先检查docker 容器情况,保证不会影响到其他服务。 ssh -p 32200 -i C:\Users\loujiajie.ssh\netease_loujiajie_id_rsa loujiajie@10.145.96.67

S3 对象服务信息

  • NOS 桶信息
    • 名称matrixaita
    • 项目artct
    • 成本项目artct
    • 区域GA
    • Endpointgzdev
    • 桶用户p-artct-matrixaita
    • 域名(内网):nos-gzdev.163nos.com

相关资产放到 AssetMaker/ 目录后面


临时需求

  1. 添加账号:
    1. 账号G37
    2. 密码G37
  2. 添加账号单点登录功能其他电脑登录后会让当前电脑登录直接失效并且退回登录页面。给G37 单点登录。

新建远程开发模式,服务器为 IP:10.219.36.57 用户名netease 密码123

使用SSH来部署前后端之后继续开发目前怀疑VPS的容器网络纯在问题使用本地另一台机器作为开发服务器进行测试


Blender节点需求

  1. 使用Docker来部署Blender 4.4.2
  2. 安装 uvpackmaster安装方法参考 uvpackmaster 安装文档
    1. Engine位于./blender/UVPackmaster 4 v4.0.2/uvpm-engine-pro-4.0.2-linux-x86_64.run
    2. Blender插件./blender/UVPackmaster 4 v4.0.2/uvpackmaster4-addon-4.0.2.zip
  3. 安装插件,位于./blender
    1. asset_organize_addon.zip
    2. batch_uv_pack_addon.zip
    3. explode_bake_addon.zip

uvpackmaster 安装文档

Linux

Follow the steps:

  1. If you are upgrading from an older UVPackmaster version, go to Blender preferences and uninstall the previous version of the UVPackmaster add-on. After uninstalling, it is strongly recommended to restart Blender once, otherwise an error may occur when installing a new add-on version.
  2. Download the latest version of the UVPackmaster add-on for Blender from the marketplace where you purchased the packer (the add-on file name starts with uvpackmaster4-addon) and has zip extension.
  3. Install the add-on using the standard procedure for Blender add-ons.
  4. Purchase a license for the 4 engine at Gumroad or Blender Market (visit the Get UVPackmaster page for details). Note that the engine is required to use the add-on packing features in Blender. After purchasing, download the UVPackmaster installer script from the marketplace. The name of the script follows a pattern: uvpm-engine-pro-{VERSION}-linux-x86_64.run. Make sure you use the correct engine version – there must be a match between the add-on version and the engine version. Also make sure your browser wont open the engine installer script on its own when you click at it in the marketplace library. Do not save the script opened in such a way. Instead, press the right mouse button on the engine script in the marketplace library and choose Save the link as.
  5. After downloading, run the installer script in the terminal. First you need to add the execute permission to it:
    chmod u+x uvpm-engine-pro-{VERSION}-linux-x86_64.run
    
  6. Then run the script:
    ./uvpm-engine-pro-{VERSION}-linux-x86_64.run
    
  7. The default extract location used by the script is /opt/uvpackmaster/engine4, but you can change it if you like using a command line argument. Changing the path is not recommended though, because the UVPackmaster addon will be able to automatically detect the engine, if it is extracted into the default path - no additional setup steps will be required. Note you will need root privilege to extract the engine into the default location on most Linux distributions. In order to run the installer script with root privilege, execute it using sudo:
    sudo ./uvpm-engine-pro-{VERSION}-linux-x86_64.run
    
  8. The engine installer script will display the EULA - you need to accept it in order to continue installation. On some Linux distributions there is a bug causing the license agreement question not to be printed after the end of the EULA is reached. If you dont see the question at the end of the EULA, simply press the Q button - after the button is pressed the question should be displayed normally.
  9. Run Blender (or restart if you had it opened). Go to the N panel of the UV editor you will find the UVPackmaster4 tab there. If you extracted the engine into the default path, at the top of the tab you should see a label reporting that the UVPackmaster engine was automatically detected by the add-on. You can immediately start using UVPackmaster features in Blender - the setup is done. If you changed the engine path, then proceed to the additional steps below.
  10. In Blender go to: Edit Menu → Preferences → Add-ons → find the UVPackmaster4 addon on the list of all addons. Expand the UVPackmaster4 addon entry - you will see a UI with the addon global preferences. In the UI press the Set Engine Path button - a file browser window will appear. In the file browser navigate to the location where you extracted the engine and localize a file named release-{VERSION}.uvpmi  select the file in the browser. Caution: do not go into any subfolder of the extracted engine folder you have to select the uvpmi file which is located in the main folder of the engine. After the uvpmi file is selected in the browser, you should notice a status message saying that the engine was initialized.
  11. Save the Blender preferences to make the engine path permanent: click on the 3-bar icon in the bottom-left corner of the Blender preferences window and press Save Preferences. You can start using UVPackmaster features in Blender - the setup is done.

节点参考

相关Blender节点为

Blender Bake backend/scripts/start_bake_server.py
Blender UV Pack start_uv_pack_server.py
Blender Organize start_organize_server.py

TODO:

保底与开发方案

  • 单点登录实现
  • Project、WorkSpace、Workflow持久化。
    • 使用楼嘉杰入职电脑部署服务来规避开发机房VPS的网络问题数据库服务都部署到入职电脑上。
    • 楼嘉杰根据沈林海编写的节点代码实现持久化。
  • Blender
    • 使用Freddy电脑部署钊铭Blender的服务本地可以SSH连接方便AI进行调试。
    • 楼嘉杰通过UU让钊铭进行远程部署。