官网地址:Autodesk Platform Services (formerly Forge)
如下图:
配置postman环境 下面我们演示通过postman上传模型到Forge云端,然后配置Forge的js渲染出来
post环境文件:
BIM.postman collection. json
{ "info": { "_postman_id": "aedeb5db-ab5a-4b0e-ba31-d329f6ef66ba", "name": "Beijing-Workshop", "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json", "_exporter_id": "24665034" }, "item": [ { "name": "1获取access token", "event": [ { "listen": "test", "script": { "exec": [ "var data = JSON.parse(responseBody);", "postman.setEnvironmentVariable(\"access_token\", data.access_token);", "postman.setEnvironmentVariable(\"expires_in\", data.expires_in);", "postman.setEnvironmentVariable(\"token_type\", data.token_type);" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/x-www-form-urlencoded" } ], "body": { "mode": "urlencoded", "urlencoded": [ { "key": "client_id", "value": "{{client_id}}", "type": "text" }, { "key": "client_secret", "value": "{{client_secret}}", "type": "text" }, { "key": "grant_type", "value": "client_credentials", "type": "text" }, { "key": "scope", "value": "data:read data:write bucket:create bucket:read", "type": "text" }, { "key": "expires_in", "value": "360000", "type": "text" } ] }, "url": "{{base_domain}}/authentication/v1/authenticate" }, "response": [] }, { "name": "2创建的存储桶(bucket)", "event": [ { "listen": "prerequest", "script": { "exec": [ "if (request.data) {", " var requestData = JSON.parse(request.data);", " postman.setEnvironmentVariable(\"bucketKey\", requestData.bucketKey);", " postman.setEnvironmentVariable(\"bucketPolicy\", requestData.policyKey);", "}" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" }, { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"bucketKey\":\"ac-persistent-bucket-test8\",\n \"policyKey\":\"persistent\"\n}" }, "url": "{{base_domain}}/oss/v2/buckets" }, "response": [] }, { "name": "3 查看bucket是否创建成功", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "url": { "raw": "{{base_domain}}/oss/v2/buckets?limit=10", "host": [ "{{base_domain}}" ], "path": [ "oss", "v2", "buckets" ], "query": [ { "key": "limit", "value": "10" } ] } }, "response": [] }, { "name": "4往bucket里放置object模型", "event": [ { "listen": "test", "script": { "exec": [ "if (responseCode.code === 200) {", " var data = JSON.parse(responseBody);", " postman.setEnvironmentVariable(\"urn\", data.objectId);", " postman.setEnvironmentVariable(\"urnBase64\", window.btoa(data.objectId));", " postman.setEnvironmentVariable(\"file_location\", data.location);", "}", "" ], "type": "text/javascript" } } ], "request": { "method": "PUT", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "body": { "mode": "file", "file": { "src": "/C:/Users/ac135/Desktop/rvtText/data/textOne.rvt" } }, "url": "{{base_domain}}/oss/v2/buckets/{{bucketKey}}/objects/aggregate-1.rvt" }, "response": [] }, { "name": "5检查对象模型是否成功上传", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "url": "{{base_domain}}/oss/v2/buckets/{{bucketKey}}/objects" }, "response": [] }, { "name": "6将模型在云端转换成SVF格式", "event": [ { "listen": "test", "script": { "exec": [ "var data = JSON.parse(responseBody);", "", "var setEnvVar = function (tar, src) {", " if (!src) {", " return;", " }", " postman.setEnvironmentVariable(tar, src);", "}", "", "if (data) {", " if (data.urn) {", " setEnvVar(\"urnBase64\", data.urn);", " }", "}" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" }, { "key": "Content-Type", "value": "application/json" }, { "key": "x-ads-force", "value": "true" } ], "body": { "mode": "raw", "raw": "{\n \"input\": {\n \"urn\": \"{{urnBase64}}\" \n },\n \"output\": {\n \"destination\": {\n \"region\": \"us\"\n },\n \"formats\": [\n {\n \"type\": \"svf\",\n \"views\":[\"2d\", \"3d\"]\n }]\n }\n}" }, "url": "{{base_domain}}/modelderivative/v2/designdata/job" }, "response": [] }, { "name": "7检查模型是否转化完成", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" }, { "key": "Accept", "value": "application/vnd.api+json,application/json" } ], "url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/manifest" }, "response": [] }, { "name": "04-POST job", "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "var data = JSON.parse(responseBody);", "", "", "if (data) {", " if (data.urn) {", " postman.setEnvironmentVariable(\"urnBase64\", data.urn);", " }", "}" ] } } ], "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" }, { "key": "Content-Type", "value": "application/json" }, { "key": "x-ads-force", "value": "true" } ], "body": { "mode": "raw", "raw": "{\n \"input\": {\n \"urn\": \"{{urnBase64}}\" \n },\n \"output\": {\n \"destination\": {\n \"region\": \"us\"\n },\n \"formats\": [\n {\n \"type\": \"svf\",\n \"views\":[\"2d\", \"3d\"]\n }]\n }\n}" }, "url": "{{base_domain}}/modelderivative/v2/designdata/job" }, "response": [] }, { "name": "06-GET metadata", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/metadata" }, "response": [] }, { "name": "07-GET metadata/:guid", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" }, { "key": "Accept-Encoding", "value": "gzip" } ], "url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/metadata/{{metadata_guid}}" }, "response": [] }, { "name": "08-GET :urn/metadata/:guid/properties", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/metadata/{{metadata_guid}}/properties" }, "response": [] }, { "name": "09-bucket details", "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "if (responseCode.code === 200 && responseBody) {", " var data = JSON.parse(responseBody);", " postman.setEnvironmentVariable(\"bucketKey\", data.bucketKey);", "}" ] } } ], "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "url": "{{base_domain}}/oss/v2/buckets/{{bucketKey}}/details" }, "response": [] }, { "name": "12-GET formats", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{access_token}}" } ], "url": "{{base_domain}}/modelderivative/v2/designdata/formats" }, "response": [] } ]}BIM.postman environment,.json
{ "id": "63cf71cf-bae6-411f-8e53-7319cf62fd9a", "name": "Beijing-Workshop", "values": [ { "key": "base_domain", "value": "https://developer.api.autodesk.com", "type": "text", "enabled": true }, { "key": "client_id", "value": "xxxxxxxxx", "type": "text", "enabled": true }, { "key": "client_secret", "value": "xxxxxxxxxxx", "type": "text", "enabled": true }, { "key": "urnBase64", "value": "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YWMtcGVyc2lzdGVudC1idWNrZXQtdGVzdDMvYWdncmVnYXRlLTEucnZ0", "type": "text", "enabled": true }, { "key": "access_token", "value": "eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dF9zeW1tZXRyaWNfa2V5In0.eyJjbGllbnRfaWQiOiJNbDhXdWJFdW52WVRaRk1za2xpQ200YnZCM0dkREVibyIsImV4cCI6MTUyNjExNDc3OCwic2NvcGUiOlsiZGF0YTpyZWFkIiwiZGF0YTp3cml0ZSIsImJ1Y2tldDpjcmVhdGUiLCJidWNrZXQ6cmVhZCJdLCJhdWQiOiJodHRwczovL2F1dG9kZXNrLmNvbS9hdWQvand0ZXhwNjAiLCJqdGkiOiIxMEV2aEVpcGhQMGszTm9FNkFOa2NnR1pKOVJUaUhDazA3dXhWMDFFc1R1M2twS2tVNnB4a2d5d3A5QXBFakpDIn0.prPXmCc9e1oxZcPFSEgPOlonHG8po16RdzDciborQlg", "type": "text", "enabled": true }, { "key": "guid", "value": "57873878-6d98-b389-aa22-fead1053823f", "type": "text", "enabled": true }, { "key": "bucketKey", "value": "xiaodong-persistent-bucket-test8", "type": "text", "enabled": true }, { "key": "guid", "value": "e22cc916-cabd-4b97-9ccd-1ab1e613f707", "type": "text", "enabled": true }, { "key": "objectKey", "value": "RevitNative.rvt", "type": "text", "enabled": true }, { "key": "expires_in", "value": "3599", "type": "text", "enabled": true }, { "key": "token_type", "value": "Bearer", "type": "text", "enabled": true }, { "key": "bucketPolicy", "value": "persistent", "type": "text", "enabled": true }, { "key": "urn", "value": "urn:adsk.objects:os.object:xiaodong-persistent-bucket-test8/workshop-2.rvt", "type": "text", "enabled": true }, { "key": "file_location", "value": "https://developer.api.autodesk.com/oss/v2/buckets/xiaodong-persistent-bucket-test8/objects/workshop-2.rvt", "type": "text", "enabled": true } ], "_postman_variable_scope": "environment", "_postman_exported_at": "2023-07-15T15:06:21.850Z", "_postman_exported_using": "Postman/10.16.0"}client_secret与client_id记住改成自己的,然后就开始用postman请求上传了
https://developer.api.autodesk.com/authentication/v1/authenticate
是用于获取 Autodesk API 的访问令牌(access token)的认证
请求中包含必要的认证 信息
grant_type:授权类型,通常为 "client_credentials"(客户端凭据模式)scope:请求的权限范围,用空格分隔多个权限(如 "data:read data:write")响应结果:
https://developer.api.autodesk.com/oss/v2/buckets
请求中包含必要的认证信息:
bucketKey:存储桶的唯一标识符,它必须是全局唯一的。可以使用小写字母、数字、连字符 - 和下划线 _ 来命名。长度应在3到128个字符之间。policyKey:存储桶的访问策略。默认为 transient,表示存储桶中的对象在30天后过期; persistent,表示永久保存响应结果:

https://developer.api.autodesk.com/oss/v2/buckets
请求中包含必要的认证信息:
请求可选的参数信息:
limit:指定要返回的存储桶数量的限制。例如,返回最多 10 个存储桶,默认为 10响应结果:

https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{objectName}
请求中包含必要的认证信息:
响应结果:

https://developer.api.autodesk.com/oss/v2/buckets/{{bucketKey}}/objects
请求中包含必要的认证信息:
响应结果:

https://developer.api.autodesk.com/modelderivative/v2/designdata/job
请求中包含必要的认证信息:
input:指定要转换的对象的 URN(Uniform Resource Name)。将 object_id 的 URN 作为输入。output:指定要生成的输出格式和文件类型。在这里,你可以指定 SVF 格式作为输出。例如,{"formats": [{"type": "svf", "views": ["2d", "3d"]}]}备注:input中的urn是 objectId转化为Base64格式
响应结果:

https://developer.api.autodesk.com/modelderivative/v2/designdata/{base64_urn}/manifest
请求中包含必要的认证信息:
响应结果:

图一表示进度,图二代表成功
html 渲染模板 将accessToken与documentId替换掉就行
<!DOCTYPE html><html> <head> <title>Autodesk Forge: 3D Viewer App Sample</title> <meta http-equiv="cache-control" content="max-age=0" /> <meta http-equiv="cache-control" content="no-cache" /> <meta http-equiv="expires" content="0" /> <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> <meta http-equiv="pragma" content="no-cache" /> <!-- Third Party package --> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <!-- Autodesk Forge Viewer files (IMPORTANT) --> <link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.51/style.min.css" type="text/css"> <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.51/viewer3D.min.js"></script> <style> /** Just simple CSS styling to make this page a little nicer **/ body { margin: 0; padding: 0; } </style></head> <body> <!-- The Viewer will be instantiated here --> <div id="MyViewerDiv"></div> <!-- Custom script --> <script> var viewer; var options = { env: 'AutodeskProduction', api: 'derivativeV2', // TODO: for models uploaded to EMEA change this option to 'derivativeV2_EU' // getAccessToken: getForgeToken accessToken: 'eyJhbGciOiJSUzI1NiIsImtpZCI6IlU3c0dGRldUTzlBekNhSzBqZURRM2dQZXBURVdWN2VhIiwicGkuYXRtIjoiN3ozaCJ9.eyJzY29wZSI6WyJkYXRhOnJlYWQiLCJkYXRhOndyaXRlIiwiYnVja2V0OmNyZWF0ZSIsImJ1Y2tldDpyZWFkIl0sImNsaWVudF9pZCI6IkpCcldjc3p3RVZCQ0dNMm5sY1J6N0tIZXZTbXpYUXM0IiwiYXVkIjoiaHR0cHM6Ly9hdXRvZGVzay5jb20vYXVkL2Fqd3RleHA2MCIsImp0aSI6ImJjWXBRalcwekh5aTZyUEd3QU1kNjdjamlWS1Q2dDZIYXNqcjFmOXR4OUExeGhZY05JWkhINVlibkdDeHVaTWoiLCJleHAiOjE2ODk5MTI0ODB9.JdpIFQAmWmsGc-t2g3tpU677G1Y11RwF4ndTxbwSa4hE5tOjYtLsMK7pR-jGGWIHAEHUkScvDixQWFIUG_o5UWpwhAdH7r06126QhGFNk_Wf1d8OvoDknqdKt9aXns_1xvxucOdPs3VkJ8BWH6j65B3fxZ7GB5jub3zeF7sGuYd1zBL9FdAcQ5_uQUBpEXh8uP4yZ_Y3yDe_mnTx2OxTMyRXsHw7quWjtxXDQXweGq0xDn3ENayOTkYnsru3_GJmGXUE4b-Zl1csHENJyyegkDqrfbaLbMeKagCWxY-RnCikmg80iWDqOd6KvIejRbQdqpjdQWz4i3Qx6Wnj6Lzf4w' }; // var documentId = 'urn:' + getUrlParameter('urn'); var documentId = 'urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YWMtcGVyc2lzdGVudC1idWNrZXQtdGVzdDMvYWdncmVnYXRlLTEucnZ0' // 初始化和加载文档的部分 Autodesk.Viewing.Initializer(options, function onInitialized() { // Find the element where the 3d viewer will live. var htmlElement = document.getElementById('MyViewerDiv'); if (htmlElement) { // Create and start the viewer in that element viewer = new Autodesk.Viewing.GuiViewer3D(htmlElement); viewer.start(); // Load the document into the viewer. Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure); $('.adsk-viewing-viewer').css('height', '80%') $('.adsk-viewing-viewer').css('width', '42%') } }); /** * 加载模型的回调函数 */ function onDocumentLoadSuccess(doc) { // Load the default viewable geometry into the viewer. // Using the doc, we have access to the root BubbleNode, // which references the root node of a graph that wraps each object from the Manifest JSON. var viewable = doc.getRoot().getDefaultGeometry(); if (viewable) { viewer.loadDocumentNode(doc, viewable).then(function (result) { console.log('Viewable Loaded!'); }).catch(function (err) { console.log('Viewable failed to load.'); console.log(err); } ) } } /** * 文档加载失败时的回调函数 */ function onDocumentLoadFailure(viewerErrorCode) { console.error('onDocumentLoadFailure() - errorCode: ' + viewerErrorCode); jQuery('#MyViewerDiv').html('<p>Translation in progress... Please try refreshing the page.</p>'); } </script></body> </html>效果图如下:
其他资源分享:视频教程:
通过Forge十分钟实现Web端3D模型浏览_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV12W41127Zp/?share_source=copy_web&vd_source=e4f3abd4d25a1863fc329c1eeaf7f440
有其他问题可以留言 或者私信
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删