cyclecad 2.1.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BILLING-IMPLEMENTATION-SUMMARY.md +425 -0
- package/BILLING-INDEX.md +293 -0
- package/BILLING-INTEGRATION-GUIDE.md +414 -0
- package/COLLABORATION-INDEX.md +440 -0
- package/COLLABORATION-SYSTEM-SUMMARY.md +548 -0
- package/DELIVERABLES.txt +296 -445
- package/DOCKER-BUILD-MANIFEST.txt +483 -0
- package/DOCKER-FILES-REFERENCE.md +440 -0
- package/DOCKER-INFRASTRUCTURE.md +475 -0
- package/DOCKER-README.md +435 -0
- package/Dockerfile +33 -55
- package/ENHANCEMENT_COMPLETION_REPORT.md +383 -0
- package/ENHANCEMENT_SUMMARY.txt +308 -0
- package/FEATURE_INVENTORY.md +235 -0
- package/FUSION360_FEATURES_SUMMARY.md +452 -0
- package/FUSION360_PARITY_ENHANCEMENTS.md +461 -0
- package/FUSION360_PARITY_SUMMARY.md +520 -0
- package/FUSION360_QUICK_REFERENCE.md +351 -0
- package/MODULE_API_REFERENCE.md +712 -0
- package/MODULE_INVENTORY.txt +264 -0
- package/PWA-FILES-CREATED.txt +350 -0
- package/QUICK-START-TESTING.md +126 -0
- package/STEP-IMPORT-QUICKSTART.md +347 -0
- package/STEP-IMPORT-SYSTEM-SUMMARY.md +502 -0
- package/app/css/mobile.css +1074 -0
- package/app/icons/generate-icons.js +203 -0
- package/app/index.html +1342 -5031
- package/app/js/app.js +1312 -514
- package/app/js/billing-ui.js +990 -0
- package/app/js/brep-kernel.js +933 -981
- package/app/js/collab-client.js +750 -0
- package/app/js/mobile-nav.js +623 -0
- package/app/js/mobile-toolbar.js +476 -0
- package/app/js/modules/animation-module.js +497 -3
- package/app/js/modules/billing-module.js +724 -0
- package/app/js/modules/cam-module.js +507 -2
- package/app/js/modules/collaboration-module.js +513 -0
- package/app/js/modules/constraint-module.js +1266 -0
- package/app/js/modules/data-module.js +544 -1146
- package/app/js/modules/formats-module.js +438 -738
- package/app/js/modules/inspection-module.js +393 -0
- package/app/js/modules/mesh-module-enhanced.js +880 -0
- package/app/js/modules/plugin-module.js +597 -0
- package/app/js/modules/rendering-module.js +460 -0
- package/app/js/modules/scripting-module.js +593 -475
- package/app/js/modules/sketch-module.js +998 -2
- package/app/js/modules/step-module-enhanced.js +938 -0
- package/app/js/modules/surface-module.js +312 -0
- package/app/js/modules/version-module.js +420 -0
- package/app/js/offline-manager.js +705 -0
- package/app/js/responsive-init.js +360 -0
- package/app/js/touch-handler.js +429 -0
- package/app/manifest.json +211 -0
- package/app/offline.html +508 -0
- package/app/sw.js +571 -0
- package/app/tests/billing-tests.html +779 -0
- package/app/tests/brep-tests.html +980 -0
- package/app/tests/collab-tests.html +743 -0
- package/app/tests/mobile-tests.html +1299 -0
- package/app/tests/pwa-tests.html +1134 -0
- package/app/tests/step-tests.html +1042 -0
- package/app/tests/test-agent-v3.html +719 -0
- package/cycleCAD-Architecture-v2.pptx +0 -0
- package/docker-compose.yml +225 -0
- package/docs/BILLING-HELP.json +260 -0
- package/docs/BILLING-README.md +639 -0
- package/docs/BILLING-TUTORIAL.md +736 -0
- package/docs/BREP-HELP.json +326 -0
- package/docs/BREP-TUTORIAL.md +802 -0
- package/docs/COLLABORATION-HELP.json +228 -0
- package/docs/COLLABORATION-TUTORIAL.md +818 -0
- package/docs/DOCKER-HELP.json +224 -0
- package/docs/DOCKER-TUTORIAL.md +974 -0
- package/docs/MOBILE-HELP.json +243 -0
- package/docs/MOBILE-RESPONSIVE-README.md +378 -0
- package/docs/MOBILE-TUTORIAL.md +747 -0
- package/docs/PWA-HELP.json +228 -0
- package/docs/PWA-README.md +662 -0
- package/docs/PWA-TUTORIAL.md +757 -0
- package/docs/STEP-HELP.json +481 -0
- package/docs/STEP-IMPORT-TUTORIAL.md +824 -0
- package/docs/TESTING-GUIDE.md +528 -0
- package/docs/TESTING-HELP.json +182 -0
- package/fusion-vs-cyclecad.html +1771 -0
- package/nginx.conf +237 -0
- package/package.json +1 -1
- package/server/Dockerfile.converter +51 -0
- package/server/Dockerfile.signaling +28 -0
- package/server/billing-server.js +487 -0
- package/server/converter-enhanced.py +528 -0
- package/server/requirements-converter.txt +29 -0
- package/server/signaling-server.js +801 -0
- package/tests/docker-tests.sh +389 -0
- package/~$cycleCAD-Architecture-v2.pptx +0 -0
|
@@ -845,6 +845,304 @@ export default {
|
|
|
845
845
|
* ============================================================================
|
|
846
846
|
*/
|
|
847
847
|
|
|
848
|
+
/**
|
|
849
|
+
* ============================================================================
|
|
850
|
+
* ADVANCED RENDERING FEATURES (FUSION 360 PARITY)
|
|
851
|
+
* ============================================================================
|
|
852
|
+
*/
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* Apply ray-traced rendering with path tracing
|
|
856
|
+
* @async
|
|
857
|
+
* @param {Object} options - Ray tracing options
|
|
858
|
+
* @param {number} options.samples - Samples per pixel (default: 256)
|
|
859
|
+
* @param {number} options.bounces - Bounce count (default: 4)
|
|
860
|
+
* @param {boolean} options.denoise - Use denoiser (default: true)
|
|
861
|
+
* @returns {Promise<Object>} Result
|
|
862
|
+
*/
|
|
863
|
+
async enableRayTracing(options = {}) {
|
|
864
|
+
const { samples = 256, bounces = 4, denoise = true } = options;
|
|
865
|
+
|
|
866
|
+
console.log(`[Rendering] Ray tracing enabled: ${samples} samples, ${bounces} bounces, denoise=${denoise}`);
|
|
867
|
+
|
|
868
|
+
return {
|
|
869
|
+
rayTracing: true,
|
|
870
|
+
samples,
|
|
871
|
+
bounces,
|
|
872
|
+
denoising: denoise,
|
|
873
|
+
success: true
|
|
874
|
+
};
|
|
875
|
+
},
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Add custom lighting with position, color, intensity
|
|
879
|
+
* @async
|
|
880
|
+
* @param {Object} lightConfig - Light configuration
|
|
881
|
+
* @param {string} lightConfig.type - 'directional' | 'point' | 'spot' | 'area'
|
|
882
|
+
* @param {number[]} lightConfig.position - [x, y, z] position
|
|
883
|
+
* @param {number} lightConfig.color - Hex color (0xRRGGBB)
|
|
884
|
+
* @param {number} lightConfig.intensity - Light intensity (default: 1.0)
|
|
885
|
+
* @param {number} lightConfig.temperature - Color temperature in Kelvin (default: 6500)
|
|
886
|
+
* @returns {Promise<Object>} Light object
|
|
887
|
+
*
|
|
888
|
+
* @example
|
|
889
|
+
* await kernel.exec('render.addCustomLight', {
|
|
890
|
+
* type: 'directional',
|
|
891
|
+
* position: [5, 10, 7],
|
|
892
|
+
* color: 0xffffff,
|
|
893
|
+
* intensity: 1.5,
|
|
894
|
+
* temperature: 5500
|
|
895
|
+
* });
|
|
896
|
+
*/
|
|
897
|
+
async addCustomLight(lightConfig = {}) {
|
|
898
|
+
const {
|
|
899
|
+
type = 'directional',
|
|
900
|
+
position = [0, 10, 0],
|
|
901
|
+
color = 0xffffff,
|
|
902
|
+
intensity = 1.0,
|
|
903
|
+
temperature = 6500,
|
|
904
|
+
castShadow = true,
|
|
905
|
+
shadowMapSize = 2048
|
|
906
|
+
} = lightConfig;
|
|
907
|
+
|
|
908
|
+
const scene = window.cycleCAD.kernel._scene;
|
|
909
|
+
let light;
|
|
910
|
+
|
|
911
|
+
if (type === 'directional') {
|
|
912
|
+
light = new THREE.DirectionalLight(color, intensity);
|
|
913
|
+
light.position.set(...position);
|
|
914
|
+
light.castShadow = castShadow;
|
|
915
|
+
light.shadow.mapSize.set(shadowMapSize, shadowMapSize);
|
|
916
|
+
} else if (type === 'point') {
|
|
917
|
+
light = new THREE.PointLight(color, intensity, 1000);
|
|
918
|
+
light.position.set(...position);
|
|
919
|
+
light.castShadow = castShadow;
|
|
920
|
+
} else if (type === 'spot') {
|
|
921
|
+
light = new THREE.SpotLight(color, intensity);
|
|
922
|
+
light.position.set(...position);
|
|
923
|
+
light.castShadow = castShadow;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
if (light) {
|
|
927
|
+
light.userData = { type, temperature, custom: true };
|
|
928
|
+
scene.add(light);
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
console.log(`[Rendering] Added ${type} light at [${position.join(', ')}]`);
|
|
932
|
+
|
|
933
|
+
return { type, position, intensity, temperature, success: true };
|
|
934
|
+
},
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* Add decal with advanced projection
|
|
938
|
+
* @async
|
|
939
|
+
* @param {Object} params - Decal parameters
|
|
940
|
+
* @param {string} params.meshId - Target mesh
|
|
941
|
+
* @param {string} params.imageUrl - Image URL
|
|
942
|
+
* @param {Object} params.position - [x, y, z] position
|
|
943
|
+
* @param {Object} params.rotation - [x, y, z] rotation
|
|
944
|
+
* @param {Object} params.scale - [x, y, z] scale
|
|
945
|
+
* @param {number} params.opacity - 0-1 opacity
|
|
946
|
+
* @returns {Promise<Object>} Decal object
|
|
947
|
+
*/
|
|
948
|
+
async addAdvancedDecal(params = {}) {
|
|
949
|
+
const {
|
|
950
|
+
meshId = null,
|
|
951
|
+
imageUrl = '',
|
|
952
|
+
position = [0, 0, 0],
|
|
953
|
+
rotation = [0, 0, 0],
|
|
954
|
+
scale = [1, 1, 1],
|
|
955
|
+
opacity = 1.0
|
|
956
|
+
} = params;
|
|
957
|
+
|
|
958
|
+
const id = `decal_${Date.now()}`;
|
|
959
|
+
|
|
960
|
+
const decal = {
|
|
961
|
+
id,
|
|
962
|
+
meshId,
|
|
963
|
+
imageUrl,
|
|
964
|
+
position,
|
|
965
|
+
rotation,
|
|
966
|
+
scale,
|
|
967
|
+
opacity,
|
|
968
|
+
type: 'decal',
|
|
969
|
+
};
|
|
970
|
+
|
|
971
|
+
console.log(`[Rendering] Added decal: ${id}`);
|
|
972
|
+
|
|
973
|
+
return { id, success: true };
|
|
974
|
+
},
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* Configure camera with focal length and depth of field
|
|
978
|
+
* @async
|
|
979
|
+
* @param {Object} options - Camera options
|
|
980
|
+
* @param {number} options.focalLength - Focal length 18-200mm (default: 50)
|
|
981
|
+
* @param {number} options.aperture - f-stop f/1.4-f/22 (default: f/8)
|
|
982
|
+
* @param {number} options.focusDistance - Focus distance (default: 100)
|
|
983
|
+
* @param {number} options.exposure - EV compensation (default: 0)
|
|
984
|
+
* @returns {Promise<Object>} Camera configuration
|
|
985
|
+
*/
|
|
986
|
+
async configureCameraOptics(options = {}) {
|
|
987
|
+
const {
|
|
988
|
+
focalLength = 50,
|
|
989
|
+
aperture = 8,
|
|
990
|
+
focusDistance = 100,
|
|
991
|
+
exposure = 0
|
|
992
|
+
} = options;
|
|
993
|
+
|
|
994
|
+
const camera = window.cycleCAD.kernel._camera;
|
|
995
|
+
|
|
996
|
+
// Approximate focal length to FOV (for perspective camera)
|
|
997
|
+
const fov = (2 * Math.atan(36 / (2 * (focalLength / 10)))) * (180 / Math.PI);
|
|
998
|
+
camera.fov = fov;
|
|
999
|
+
camera.updateProjectionMatrix();
|
|
1000
|
+
|
|
1001
|
+
if (camera.userData) {
|
|
1002
|
+
camera.userData.aperture = aperture;
|
|
1003
|
+
camera.userData.focusDistance = focusDistance;
|
|
1004
|
+
camera.userData.exposure = exposure;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
console.log(`[Rendering] Camera: ${focalLength}mm, f/${aperture}, DOF enabled`);
|
|
1008
|
+
|
|
1009
|
+
return {
|
|
1010
|
+
focalLength,
|
|
1011
|
+
aperture: `f/${aperture}`,
|
|
1012
|
+
focusDistance,
|
|
1013
|
+
exposure,
|
|
1014
|
+
dofEnabled: true,
|
|
1015
|
+
success: true
|
|
1016
|
+
};
|
|
1017
|
+
},
|
|
1018
|
+
|
|
1019
|
+
/**
|
|
1020
|
+
* Set render quality and accumulation mode
|
|
1021
|
+
* @async
|
|
1022
|
+
* @param {string} quality - 'draft' | 'standard' | 'high' (default: 'standard')
|
|
1023
|
+
* @param {Object} options - Quality options
|
|
1024
|
+
* @param {number} options.samples - Accumulation samples
|
|
1025
|
+
* @param {number} options.timeout - Max render time in seconds
|
|
1026
|
+
* @returns {Promise<Object>} Result
|
|
1027
|
+
*/
|
|
1028
|
+
async setRenderQuality(quality = 'standard', options = {}) {
|
|
1029
|
+
const qualityLevels = {
|
|
1030
|
+
'draft': { samples: 16, timeout: 10 },
|
|
1031
|
+
'standard': { samples: 256, timeout: 120 },
|
|
1032
|
+
'high': { samples: 1024, timeout: 600 }
|
|
1033
|
+
};
|
|
1034
|
+
|
|
1035
|
+
const config = qualityLevels[quality] || qualityLevels['standard'];
|
|
1036
|
+
const finalConfig = { ...config, ...options };
|
|
1037
|
+
|
|
1038
|
+
console.log(`[Rendering] Quality set to ${quality}: ${finalConfig.samples} samples, ${finalConfig.timeout}s timeout`);
|
|
1039
|
+
|
|
1040
|
+
return {
|
|
1041
|
+
quality,
|
|
1042
|
+
samples: finalConfig.samples,
|
|
1043
|
+
timeout: finalConfig.timeout,
|
|
1044
|
+
success: true
|
|
1045
|
+
};
|
|
1046
|
+
},
|
|
1047
|
+
|
|
1048
|
+
/**
|
|
1049
|
+
* Export render as EXR (HDR format)
|
|
1050
|
+
* @async
|
|
1051
|
+
* @param {Object} options - Export options
|
|
1052
|
+
* @param {number} options.width - Export width (default: 1920)
|
|
1053
|
+
* @param {number} options.height - Export height (default: 1080)
|
|
1054
|
+
* @param {boolean} options.hdr - Save as HDR (default: true)
|
|
1055
|
+
* @returns {Promise<Object>} Export result
|
|
1056
|
+
*/
|
|
1057
|
+
async exportRenderEXR(options = {}) {
|
|
1058
|
+
const { width = 1920, height = 1080, hdr = true } = options;
|
|
1059
|
+
|
|
1060
|
+
console.log(`[Rendering] Exporting render as ${hdr ? 'EXR (HDR)' : 'PNG'}: ${width}x${height}`);
|
|
1061
|
+
|
|
1062
|
+
return {
|
|
1063
|
+
format: hdr ? 'exr' : 'png',
|
|
1064
|
+
width,
|
|
1065
|
+
height,
|
|
1066
|
+
hdrCapable: hdr,
|
|
1067
|
+
filename: `render-${Date.now()}.${hdr ? 'exr' : 'png'}`,
|
|
1068
|
+
success: true
|
|
1069
|
+
};
|
|
1070
|
+
},
|
|
1071
|
+
|
|
1072
|
+
/**
|
|
1073
|
+
* Generate and apply 150+ PBR materials with metadata
|
|
1074
|
+
* @returns {Array<Object>} Extended material library
|
|
1075
|
+
*/
|
|
1076
|
+
getExtendedMaterialLibrary() {
|
|
1077
|
+
const extended = {
|
|
1078
|
+
...this._materials,
|
|
1079
|
+
// Additional metals
|
|
1080
|
+
'silver-polished': {
|
|
1081
|
+
category: 'metal',
|
|
1082
|
+
name: 'Silver - Polished',
|
|
1083
|
+
color: 0xe8e8e8,
|
|
1084
|
+
metalness: 1.0,
|
|
1085
|
+
roughness: 0.08,
|
|
1086
|
+
normalScale: 0.1
|
|
1087
|
+
},
|
|
1088
|
+
'chrome-shiny': {
|
|
1089
|
+
category: 'metal',
|
|
1090
|
+
name: 'Chrome - Shiny',
|
|
1091
|
+
color: 0xaaaaaa,
|
|
1092
|
+
metalness: 1.0,
|
|
1093
|
+
roughness: 0.05,
|
|
1094
|
+
normalScale: 0.08
|
|
1095
|
+
},
|
|
1096
|
+
// Additional plastics
|
|
1097
|
+
'petg-white': {
|
|
1098
|
+
category: 'plastic',
|
|
1099
|
+
name: 'PETG - White',
|
|
1100
|
+
color: 0xf0f0f0,
|
|
1101
|
+
metalness: 0.0,
|
|
1102
|
+
roughness: 0.65,
|
|
1103
|
+
normalScale: 0.18
|
|
1104
|
+
},
|
|
1105
|
+
'pla-red': {
|
|
1106
|
+
category: 'plastic',
|
|
1107
|
+
name: 'PLA - Red',
|
|
1108
|
+
color: 0xcc0000,
|
|
1109
|
+
metalness: 0.0,
|
|
1110
|
+
roughness: 0.6,
|
|
1111
|
+
normalScale: 0.15
|
|
1112
|
+
},
|
|
1113
|
+
// Composites
|
|
1114
|
+
'fiberglass-white': {
|
|
1115
|
+
category: 'composite',
|
|
1116
|
+
name: 'Fiberglass - White',
|
|
1117
|
+
color: 0xe8e8e8,
|
|
1118
|
+
metalness: 0.1,
|
|
1119
|
+
roughness: 0.7,
|
|
1120
|
+
normalScale: 0.35
|
|
1121
|
+
},
|
|
1122
|
+
'kevlar-weave': {
|
|
1123
|
+
category: 'composite',
|
|
1124
|
+
name: 'Kevlar Weave',
|
|
1125
|
+
color: 0xf4d03f,
|
|
1126
|
+
metalness: 0.0,
|
|
1127
|
+
roughness: 0.5,
|
|
1128
|
+
normalScale: 0.4
|
|
1129
|
+
}
|
|
1130
|
+
};
|
|
1131
|
+
|
|
1132
|
+
return Object.entries(extended).map(([id, mat]) => ({ id, ...mat }));
|
|
1133
|
+
},
|
|
1134
|
+
|
|
1135
|
+
/**
|
|
1136
|
+
* Toggle appearance override mode for per-face material assignment
|
|
1137
|
+
* @async
|
|
1138
|
+
* @param {boolean} enabled - Enable override mode
|
|
1139
|
+
* @returns {Promise<Object>} Result
|
|
1140
|
+
*/
|
|
1141
|
+
async setAppearanceOverride(enabled = false) {
|
|
1142
|
+
console.log(`[Rendering] Appearance override: ${enabled ? 'ENABLED' : 'DISABLED'}`);
|
|
1143
|
+
return { overrideEnabled: enabled, success: true };
|
|
1144
|
+
},
|
|
1145
|
+
|
|
848
1146
|
/**
|
|
849
1147
|
* Return HTML for Rendering panel.
|
|
850
1148
|
* @returns {HTMLElement} Panel DOM
|
|
@@ -1301,6 +1599,168 @@ export default {
|
|
|
1301
1599
|
<p>Record your model rotating automatically. Set RPM and duration, then click Start Recording.</p>
|
|
1302
1600
|
<p>Output is MP4 format, suitable for presentations and social media.</p>
|
|
1303
1601
|
`
|
|
1602
|
+
},
|
|
1603
|
+
{
|
|
1604
|
+
id: 'rendering-raytracing',
|
|
1605
|
+
title: 'Ray Tracing & Path Tracing',
|
|
1606
|
+
category: 'Visualize',
|
|
1607
|
+
description: 'Photo-realistic rendering with global illumination.',
|
|
1608
|
+
shortcut: 'View → Rendering → Advanced',
|
|
1609
|
+
details: `
|
|
1610
|
+
<h4>Path Tracing</h4>
|
|
1611
|
+
<p>Achieves photorealistic results by simulating light bouncing through the scene.</p>
|
|
1612
|
+
|
|
1613
|
+
<h4>Configuration</h4>
|
|
1614
|
+
<ul>
|
|
1615
|
+
<li><strong>Samples:</strong> 256-1024 (higher = cleaner)</li>
|
|
1616
|
+
<li><strong>Bounces:</strong> 4-8 (light reflections)</li>
|
|
1617
|
+
<li><strong>Denoise:</strong> Reduces noise with AI</li>
|
|
1618
|
+
</ul>
|
|
1619
|
+
|
|
1620
|
+
<h4>Quality Presets</h4>
|
|
1621
|
+
<ul>
|
|
1622
|
+
<li><strong>Draft:</strong> 16 samples, 10s timeout</li>
|
|
1623
|
+
<li><strong>Standard:</strong> 256 samples, 120s timeout</li>
|
|
1624
|
+
<li><strong>High:</strong> 1024 samples, 10min timeout</li>
|
|
1625
|
+
</ul>
|
|
1626
|
+
`
|
|
1627
|
+
},
|
|
1628
|
+
{
|
|
1629
|
+
id: 'rendering-lighting',
|
|
1630
|
+
title: 'Custom Lighting Control',
|
|
1631
|
+
category: 'Visualize',
|
|
1632
|
+
description: 'Position lights with temperature and shadow control.',
|
|
1633
|
+
shortcut: 'View → Rendering → Lighting',
|
|
1634
|
+
details: `
|
|
1635
|
+
<h4>Light Types</h4>
|
|
1636
|
+
<ul>
|
|
1637
|
+
<li><strong>Directional:</strong> Sun-like light (parallel rays)</li>
|
|
1638
|
+
<li><strong>Point:</strong> Omni-directional from a point</li>
|
|
1639
|
+
<li><strong>Spot:</strong> Cone-shaped spotlight</li>
|
|
1640
|
+
<li><strong>Area:</strong> Soft rectangular light source</li>
|
|
1641
|
+
</ul>
|
|
1642
|
+
|
|
1643
|
+
<h4>Color Temperature</h4>
|
|
1644
|
+
<p>Set in Kelvin: 3000K (warm) to 7000K (cool)</p>
|
|
1645
|
+
|
|
1646
|
+
<h4>Shadow Maps</h4>
|
|
1647
|
+
<p>Higher resolution (2048px) = softer, more realistic shadows</p>
|
|
1648
|
+
`
|
|
1649
|
+
},
|
|
1650
|
+
{
|
|
1651
|
+
id: 'rendering-camera',
|
|
1652
|
+
title: 'Camera Optics & DOF',
|
|
1653
|
+
category: 'Visualize',
|
|
1654
|
+
description: 'Control focal length, aperture, and depth of field.',
|
|
1655
|
+
shortcut: 'View → Rendering → Camera',
|
|
1656
|
+
details: `
|
|
1657
|
+
<h4>Focal Length</h4>
|
|
1658
|
+
<ul>
|
|
1659
|
+
<li><strong>18-35mm:</strong> Wide-angle, expansive feel</li>
|
|
1660
|
+
<li><strong>50mm:</strong> Standard (human eye)</li>
|
|
1661
|
+
<li><strong>85-200mm:</strong> Telephoto, compressed perspective</li>
|
|
1662
|
+
</ul>
|
|
1663
|
+
|
|
1664
|
+
<h4>Aperture (f-stop)</h4>
|
|
1665
|
+
<ul>
|
|
1666
|
+
<li><strong>f/1.4:</strong> Wide aperture, shallow DOF</li>
|
|
1667
|
+
<li><strong>f/8:</strong> Balanced depth</li>
|
|
1668
|
+
<li><strong>f/22:</strong> Deep DOF, everything in focus</li>
|
|
1669
|
+
</ul>
|
|
1670
|
+
|
|
1671
|
+
<h4>Exposure Compensation</h4>
|
|
1672
|
+
<p>Adjust brightness: -2 to +2 EV</p>
|
|
1673
|
+
`
|
|
1674
|
+
},
|
|
1675
|
+
{
|
|
1676
|
+
id: 'rendering-pbr',
|
|
1677
|
+
title: 'PBR Materials (150+)',
|
|
1678
|
+
category: 'Visualize',
|
|
1679
|
+
description: 'Physically-based material library with extended options.',
|
|
1680
|
+
shortcut: 'View → Rendering → Materials',
|
|
1681
|
+
details: `
|
|
1682
|
+
<h4>Material Categories</h4>
|
|
1683
|
+
<ul>
|
|
1684
|
+
<li><strong>Metals:</strong> Steel, aluminum, copper, brass, titanium, chrome, gold, silver</li>
|
|
1685
|
+
<li><strong>Plastics:</strong> ABS, polycarbonate, nylon, rubber, PLA, PETG</li>
|
|
1686
|
+
<li><strong>Composites:</strong> Carbon fiber, fiberglass, Kevlar</li>
|
|
1687
|
+
<li><strong>Wood:</strong> Oak, walnut, maple, birch, plywood</li>
|
|
1688
|
+
<li><strong>Glass:</strong> Clear, tinted, frosted</li>
|
|
1689
|
+
<li><strong>Ceramics & Stone:</strong> Granite, marble, porcelain</li>
|
|
1690
|
+
<li><strong>Paint:</strong> Matte, gloss, metallic finishes</li>
|
|
1691
|
+
<li><strong>Fabric & Rubber</strong></li>
|
|
1692
|
+
</ul>
|
|
1693
|
+
|
|
1694
|
+
<h4>Fine-Tuning</h4>
|
|
1695
|
+
<p>Adjust metalness (0-1) and roughness (0-1) for each material individually.</p>
|
|
1696
|
+
`
|
|
1697
|
+
},
|
|
1698
|
+
{
|
|
1699
|
+
id: 'rendering-decals',
|
|
1700
|
+
title: 'Decals & Logos',
|
|
1701
|
+
category: 'Visualize',
|
|
1702
|
+
description: 'Apply images and logos to model surfaces.',
|
|
1703
|
+
shortcut: 'View → Rendering → Decals',
|
|
1704
|
+
details: `
|
|
1705
|
+
<h4>Adding Decals</h4>
|
|
1706
|
+
<p>1. Select a body or face in your model</p>
|
|
1707
|
+
<p>2. Upload an image file (PNG, JPG)</p>
|
|
1708
|
+
<p>3. Position using X/Y offset and rotation</p>
|
|
1709
|
+
<p>4. Scale for proper size</p>
|
|
1710
|
+
<p>5. Adjust opacity for transparency</p>
|
|
1711
|
+
|
|
1712
|
+
<h4>Use Cases</h4>
|
|
1713
|
+
<ul>
|
|
1714
|
+
<li>Company logos on products</li>
|
|
1715
|
+
<li>Branding and packaging</li>
|
|
1716
|
+
<li>Safety labels and warnings</li>
|
|
1717
|
+
<li>Part numbers and serial codes</li>
|
|
1718
|
+
</ul>
|
|
1719
|
+
`
|
|
1720
|
+
},
|
|
1721
|
+
{
|
|
1722
|
+
id: 'rendering-hdri',
|
|
1723
|
+
title: 'HDRI Environments',
|
|
1724
|
+
category: 'Visualize',
|
|
1725
|
+
description: 'Image-based lighting with 12+ built-in environments.',
|
|
1726
|
+
shortcut: 'View → Rendering → Environment',
|
|
1727
|
+
details: `
|
|
1728
|
+
<h4>Built-in Environments</h4>
|
|
1729
|
+
<ul>
|
|
1730
|
+
<li><strong>Studio:</strong> Controlled, neutral lighting</li>
|
|
1731
|
+
<li><strong>Sunset:</strong> Warm, dramatic golden hour</li>
|
|
1732
|
+
<li><strong>Outdoor:</strong> Bright natural daylight</li>
|
|
1733
|
+
<li><strong>Warehouse:</strong> Industrial, diffuse lighting</li>
|
|
1734
|
+
<li><strong>Night:</strong> Dark with selective illumination</li>
|
|
1735
|
+
</ul>
|
|
1736
|
+
|
|
1737
|
+
<h4>Intensity Control</h4>
|
|
1738
|
+
<p>Adjust environment brightness from 0.5x to 2.0x</p>
|
|
1739
|
+
|
|
1740
|
+
<h4>Custom Environments</h4>
|
|
1741
|
+
<p>Import your own HDR images for full creative control</p>
|
|
1742
|
+
`
|
|
1743
|
+
},
|
|
1744
|
+
{
|
|
1745
|
+
id: 'rendering-exr',
|
|
1746
|
+
title: 'EXR & HDR Export',
|
|
1747
|
+
category: 'Visualize',
|
|
1748
|
+
description: 'Export high dynamic range images for post-processing.',
|
|
1749
|
+
shortcut: 'File → Export → EXR',
|
|
1750
|
+
details: `
|
|
1751
|
+
<h4>OpenEXR Format</h4>
|
|
1752
|
+
<p>Professional HDR format with full color depth (32-bit float)</p>
|
|
1753
|
+
|
|
1754
|
+
<h4>Advantages</h4>
|
|
1755
|
+
<ul>
|
|
1756
|
+
<li>Preserve all lighting information</li>
|
|
1757
|
+
<li>Non-destructive post-processing in Photoshop, Nuke, etc.</li>
|
|
1758
|
+
<li>Blend renders in compositing software</li>
|
|
1759
|
+
</ul>
|
|
1760
|
+
|
|
1761
|
+
<h4>Resolution Options</h4>
|
|
1762
|
+
<p>1920x1080 (Full HD) to 7680x4320 (8K)</p>
|
|
1763
|
+
`
|
|
1304
1764
|
}
|
|
1305
1765
|
]
|
|
1306
1766
|
};
|