| 两侧同时换到之前的修订记录
前一修订版
后一修订版
|
前一修订版
|
en:stpc-sxxx-3568b [2026/11/14 01:21] wjj Complete manual: chapters 3-7, pin definitions, development resources; add 3D teardown view |
en:stpc-sxxx-3568b [2026/11/14 05:26] (当前版本) wjj Typographic fix: en dash in 7.4 note |
| } | } |
| .sml-3d{position:absolute;inset:0;display:none;z-index:4;background:#f3f6fa;}.sml-g-stage.on3d{height:430px;}.sml-g-stage.on3d>*:not(.sml-3d){visibility:hidden;}.sml-g-stage.on3d .sml-3d{display:block;}.sml-g-side.on3d{justify-content:flex-start;}.sml-g-side.on3d button.sml-g-thumb{flex:0 0 auto;min-height:38px;}button.sml-g-thumb[data-3d] svg{display:block;width:100%;height:100%;}@media (max-width:900px){.sml-g-stage.on3d{height:330px;}.sml-g-side{flex-wrap:wrap!important;gap:4px!important;}button.sml-g-thumb{flex:1 1 calc(33.333% - 3px)!important;min-width:0;}.sml-g-side.on3d button.sml-g-thumb{min-height:44px;}.sml-g-cap{max-width:calc(100% - 78px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}} | .sml-3d{position:absolute;inset:0;display:none;z-index:4;background:#f3f6fa;}.sml-g-stage.on3d{height:430px;}.sml-g-stage.on3d>*:not(.sml-3d){visibility:hidden;}.sml-g-stage.on3d .sml-3d{display:block;}.sml-g-side.on3d{justify-content:flex-start;}.sml-g-side.on3d button.sml-g-thumb{flex:0 0 auto;min-height:38px;}button.sml-g-thumb[data-3d] svg{display:block;width:100%;height:100%;}@media (max-width:900px){.sml-g-stage.on3d{height:330px;}.sml-g-side{flex-wrap:wrap!important;gap:4px!important;}button.sml-g-thumb{flex:1 1 calc(33.333% - 3px)!important;min-width:0;}.sml-g-side.on3d button.sml-g-thumb{min-height:44px;}.sml-g-cap{max-width:calc(100% - 78px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}} |
| | .sml-g-side{flex:0 0 168px;} |
| </style></html> | </style></html> |
| <html><script> | <html><script> |
| <div class="sml-gallery"> | <div class="sml-gallery"> |
| <div class="sml-g-head"><div><div class="sml-g-kicker">PRODUCT GALLERY</div><div class="sml-g-title">sTPC-SXXX-3568B Series · Exterior</div></div><div class="sml-g-note">Shown on the S156 model · click a view on the right</div></div> | <div class="sml-g-head"><div><div class="sml-g-kicker">PRODUCT GALLERY</div><div class="sml-g-title">sTPC-SXXX-3568B Series · Exterior</div></div><div class="sml-g-note">Shown on the S156 model · click a view on the right</div></div> |
| <div class="sml-g-body"><div class="sml-g-stage"><img id="sml-g-main" class="sml-g-main" src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front_v.jpg" alt="Front view · Full-flat capacitive touch glass, plastic bezel"><div class="sml-g-badge">PANEL PC</div><a id="sml-g-zoom" class="sml-g-zoom" href="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front.jpg" target="_blank" rel="noopener">Open full size ↗</a><div class="sml-3d" id="sml-3d"></div><div class="sml-g-cap" id="sml-g-cap">Front view · Full-flat capacitive touch glass, plastic bezel</div><div class="sml-g-count" id="sml-g-count">01 / 06</div></div> | <div class="sml-g-body"><div class="sml-g-stage"><img id="sml-g-main" class="sml-g-main" src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front_v.jpg" alt="Front view · Full-flat capacitive touch glass, plastic bezel"><div class="sml-g-badge">PANEL PC</div><a id="sml-g-zoom" class="sml-g-zoom" href="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front.jpg" target="_blank" rel="noopener">Open full size ↗</a><div class="sml-3d" id="sml-3d"></div><div class="sml-g-cap" id="sml-g-cap">Front view · Capacitive touch panel</div><div class="sml-g-count" id="sml-g-count">01 / 06</div></div> |
| <div class="sml-g-side"><div class="sml-g-side-hd">06 VIEWS</div> | <div class="sml-g-side"><div class="sml-g-side-hd">06 VIEWS</div> |
| <button type="button" class="sml-g-thumb on" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front.jpg" data-idx="01" data-cap="Front view · Full-flat capacitive touch glass, plastic bezel"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_01.jpg" alt="Front view"></span><span class="sml-g-tx"><b>VIEW 01</b>Front view</span></button> | <button type="button" class="sml-g-thumb on" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_front.jpg" data-idx="01" data-cap="Front view · Capacitive touch panel"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_01.jpg" alt="Front view"></span><span class="sml-g-tx"><b>SLC</b>Front view</span></button> |
| <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_persp_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_persp.jpg" data-idx="02" data-cap="Perspective · Raised rear expansion bay, fanless structure"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_02.jpg" alt="Perspective"></span><span class="sml-g-tx"><b>VIEW 02</b>Perspective</span></button> | <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_persp_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_persp.jpg" data-idx="02" data-cap="Perspective · Main module"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_02.jpg" alt="Perspective"></span><span class="sml-g-tx"><b>SLC</b>Perspective</span></button> |
| <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_back_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_back.jpg" data-idx="03" data-cap="Back view · Brushed SUS201 stainless rear housing, VESA holes"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_03.jpg" alt="Back view"></span><span class="sml-g-tx"><b>VIEW 03</b>Back view</span></button> | <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_back_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_back.jpg" data-idx="03" data-cap="Back view · Mounting back plate"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_03.jpg" alt="Back view"></span><span class="sml-g-tx"><b>SLC</b>Back view</span></button> |
| <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_a_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_a.jpg" data-idx="04" data-cap="Lower I/O row · Power, serial, HDMI, LAN and USB in one row"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_04.jpg" alt="Lower I/O row"></span><span class="sml-g-tx"><b>VIEW 04</b>Lower I/O row</span></button> | <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_a_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_a.jpg" data-idx="04" data-cap="Lower I/O row · Power and network"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_04.jpg" alt="Lower I/O row"></span><span class="sml-g-tx"><b>SLC</b>Lower I/O row</span></button> |
| <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_b_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_b.jpg" data-idx="05" data-cap="Upper I/O row · SIM, antennas, speaker and GPIO header"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_05.jpg" alt="Upper I/O row"></span><span class="sml-g-tx"><b>VIEW 05</b>Upper I/O row</span></button> | <button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_b_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_io_b.jpg" data-idx="05" data-cap="Upper I/O row · SIM and antennas"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_thumb_05.jpg" alt="Upper I/O row"></span><span class="sml-g-tx"><b>SLC</b>Upper I/O row</span></button> |
| <button type="button" class="sml-g-thumb" data-3d="1" data-idx="06" data-zip="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_3d.zip" data-lang="en" data-cap="Interactive 3D teardown · drag to orbit, scroll to zoom, click a part"><span class="sml-g-tn"><svg viewBox="0 0 44 30" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><g fill="none" stroke="#0b5394" stroke-width="1.3" stroke-linejoin="round"><path d="M12 8 L22 3 L32 8 L22 13 Z"/><path d="M12 8 L12 20 L22 25 L22 13"/><path d="M32 8 L32 20 L22 25"/><path d="M17 5.5 L27 10.5" stroke="#8fb2d6" stroke-width="1"/></g></svg></span><span class="sml-g-tx"><b>VIEW 06</b>3D Teardown</span></button> | <button type="button" class="sml-g-thumb" data-3d="1" data-idx="06" data-zip="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_s156_3d.zip" data-lang="en" data-size="about 1.3 MB" data-rear="3" data-parts="[["机身中框","Mid Frame","#363a3f",0.0,1],["视窗玻璃","Front Glass","#101113",1.55,1],["显示模组","Display Module","#2a2e33",1.05,1],["后盖","Rear Cover","#f3f5f7",1.45,-1],["主板载板","Carrier Board","#2f6f59",0.55,1],["屏线组件","Panel Cable","#c9a227",0.55,1],["天线/顶条","Antenna Bar","#7b5ea7",0.6,-1],["固定卡扣","Clip","#8e99a6",0.3,-1],["固定卡扣","Clip","#8e99a6",0.3,-1],["紧固件","Fastener","#8e99a6",0.3,-1],["下侧接口座","I/O Block","#a45a52",0.45,-1],["接地弹片","Ground Spring","#9aa4b0",0.2,-1],["竖向排线","Vertical FPC","#c9a227",0.45,-1],["接地弹片","Ground Spring","#9aa4b0",0.2,-1],["喇叭","Speaker","#a45a52",0.45,-1],["主板组件","Main Board","#2f6f5c",0.75,-1],["前面框","Front Bezel","#191b1e",1.75,1]]" data-cap="3D Teardown · Part structure"><span class="sml-g-tn"><svg viewBox="0 0 44 30" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><g fill="none" stroke="#0b5394" stroke-width="1.3" stroke-linejoin="round"><path d="M12 8 L22 3 L32 8 L22 13 Z"/><path d="M12 8 L12 20 L22 25 L22 13"/><path d="M32 8 L32 20 L22 25"/><path d="M17 5.5 L27 10.5" stroke="#8fb2d6" stroke-width="1"/></g></svg></span><span class="sml-g-tx"><b>SLC</b>3D Teardown</span></button> |
| </div></div> | </div></div> |
| <div class="sml-g-specs"><div class="sml-g-spec"><b>RK3568</b><em>Quad Cortex-A55 · 1TOPS NPU</em></div><div class="sml-g-spec"><b>10.1″–21.5″</b><em>Three sizes · capacitive</em></div><div class="sml-g-spec"><b>Fanless</b><em>VESA / panel cutout</em></div><div class="sml-g-spec"><b>Dual OS</b><em>Android 11 / Ubuntu 22.04</em></div></div> | <div class="sml-g-specs"><div class="sml-g-spec"><b>RK3568</b><em>Quad Cortex-A55 · 1TOPS NPU</em></div><div class="sml-g-spec"><b>10.1″–21.5″</b><em>Three sizes · capacitive</em></div><div class="sml-g-spec"><b>Fanless</b><em>VESA / panel cutout</em></div><div class="sml-g-spec"><b>Dual OS</b><em>Android 11 / Ubuntu 22.04</em></div></div> |
| var zoom=document.getElementById('sml-g-zoom'); | var zoom=document.getElementById('sml-g-zoom'); |
| var bs=document.querySelectorAll('button.sml-g-thumb'); | var bs=document.querySelectorAll('button.sml-g-thumb'); |
| var stage=st.parentNode, side=document.querySelector('.sml-g-side'); | |
| var host=document.getElementById('sml-3d'), v3=null; | |
| function to3d(btn){ | |
| stage.className='sml-g-stage on3d'; | |
| if(side) side.className='sml-g-side on3d'; | |
| if(!v3){ | |
| if(!window.SML3D){ cap.textContent=btn.getAttribute('data-cap'); return; } | |
| v3=window.SML3D(host,{url:btn.getAttribute('data-zip'),lang:btn.getAttribute('data-lang')}); | |
| v3.start(); | |
| } | |
| } | |
| function toPhoto(){ | |
| stage.className='sml-g-stage'; | |
| if(side) side.className='sml-g-side'; | |
| } | |
| for(var i=0;i<bs.length;i++){ | for(var i=0;i<bs.length;i++){ |
| bs[i].addEventListener('click',function(){ | bs[i].addEventListener('click',function(){ |
| this.className='sml-g-thumb on'; | this.className='sml-g-thumb on'; |
| var self=this; | var self=this; |
| var tot=bs.length; cnt.textContent=self.getAttribute('data-idx')+' / '+(tot<10?'0'+tot:tot); | |
| cap.textContent=self.getAttribute('data-cap'); | |
| if(self.getAttribute('data-3d')){ to3d(self); return; } | |
| toPhoto(); | |
| st.style.opacity='0.35'; | st.style.opacity='0.35'; |
| window.setTimeout(function(){ | window.setTimeout(function(){ |
| st.style.opacity='1'; | st.style.opacity='1'; |
| },90); | },90); |
| | cap.textContent=self.getAttribute('data-cap'); |
| | var tot=bs.length; cnt.textContent=self.getAttribute('data-idx')+' / '+(tot<10?'0'+tot:tot); |
| zoom.href=self.getAttribute('data-full'); | zoom.href=self.getAttribute('data-full'); |
| }); | }); |
| |
| ==== 2.3 Interface Pin Definitions ==== | ==== 2.3 Interface Pin Definitions ==== |
| All external connectors on the unit are finished connectors; no bare board pin headers. The serial ports and speaker use pluggable terminal blocks with 3.5mm / 2.0mm pitch; align wiring with the silkscreen labels. Recommended wire gauge: 0.2 ~ 1.5mm²; strip length: 6 ~ 7mm. | All external connectors on the unit are finished connectors; no bare board pin headers. The serial ports and speaker use pluggable terminal blocks with 2.5mm / 2.0mm pitch; align wiring with the silkscreen labels. Recommended wire gauge: 0.2 ~ 1.5mm²; strip length: 6 ~ 7mm. |
| |
| **DC 12V (5.5×2.1mm Barrel Connector)** | **DC 12V (5.5×2.1mm Barrel Connector)** |
| | Protection | Overvoltage protection, overcurrent protection | | | Protection | Overvoltage protection, overcurrent protection | |
| |
| **RS485 (3.5mm 3P Terminal, 2 Groups: ttyS1 / ttyS3)** | **RS485 (2.5mm 3P Terminal, 2 Groups: ttyS1 / ttyS3)** |
| |
| ^ Pin ^ RS485-1 (ttyS1)^ RS485-2 (ttyS3)^ Description ^ | ^ Pin ^ RS485-1 (ttyS1)^ RS485-2 (ttyS3)^ Description ^ |
| Half duplex; transmit/receive direction is switched automatically by hardware; no software RTS control is required. | Half duplex; transmit/receive direction is switched automatically by hardware; no software RTS control is required. |
| |
| **RS232 (3.5mm 3P Terminal, 2 Groups: ttyS2 / ttyS4)** | **RS232 (2.5mm 3P Terminal, 2 Groups: ttyS2 / ttyS4)** |
| |
| ^ Pin ^ RS232-1 (ttyS2)^ RS232-2 (ttyS4)^ Description ^ | ^ Pin ^ RS232-1 (ttyS2)^ RS232-2 (ttyS4)^ Description ^ |
| **Precautions** | **Precautions** |
| |
| - The unit has a 3.5mm 3P pluggable terminal (no DB9); use a crimp terminal or adapter cable. Adapter cable pinouts may differ between manufacturers; reversing A / B or R / T directly causes communication failure | - The unit has a 2.5mm 3P pluggable terminal (no DB9); use a crimp terminal or adapter cable. Adapter cable pinouts may differ between manufacturers; reversing A / B or R / T directly causes communication failure |
| - RS485 is half-duplex; direction is switched automatically by hardware, so observe the frame interval when switching between transmit and receive | - RS485 is half-duplex; direction is switched automatically by hardware, so observe the frame interval when switching between transmit and receive |
| |
| **Precautions** | **Precautions** |
| |
| - The unit uses a 3.5mm 3P pluggable terminal (no DB9); use with crimp terminals or an adapter cable; reversing the wire order (A / B, R / T) will directly cause communication failure | - The unit uses a 2.5mm 3P pluggable terminal (no DB9); use with crimp terminals or an adapter cable; reversing the wire order (A / B, R / T) will directly cause communication failure |
| - RS485 is half-duplex; direction is switched automatically by hardware, so observe the frame interval when switching between transmit and receive | - RS485 is half-duplex; direction is switched automatically by hardware, so observe the frame interval when switching between transmit and receive |
| - If permission is denied, add the current user to the dialout group: sudo usermod -aG dialout $USER (takes effect after re-login) | - If permission is denied, add the current user to the dialout group: sudo usermod -aG dialout $USER (takes effect after re-login) |
| |
| ==== 7.4 Development Resources ==== | ==== 7.4 Development Resources ==== |
| Datasheets, drivers, SDK, firmware and flashing tools are published per model; the entry point is: | Datasheets, drivers, SDK, firmware and flashing tools are maintained per model; contact Sales or Technical Support to obtain them. |
| |
| **Resources:** [[https://www.showdoc.com.cn/nodka01/11559011770088384|sTPC-SXXX-3568B product development resources]] — ShowDoc online documentation | **Note:** Flashing, ADB, serial and GPIO procedures are described in chapters 3–7 of this page; for interface count and location see 2.2. |
| | |
| **Note:** These resources are authoritative; fetch the latest files there after a version update. Flashing, ADB, serial and GPIO procedures are described in sections 3–7 of this page; interface count and location follow section 2.2. | |
| |
| <html><style> | <html><style> |
| "use strict"; | "use strict"; |
| |
| /* ===== 零件信息:按结构位置命名(STEP 无零件名,名称按几何位置推定) ===== */ | /* ===== 默认零件表(仅 sTPC-S156-3568B;其它机型由 cfg.parts 传入) ===== */ |
| var PARTS = [ | var PARTS_S156 = [ |
| /* 0 */ {n:'机身中框', e:'Mid Frame', col:'#b8c2cd', k:0.00, d:[0,0,0]}, | /* 0 */ {n:'机身中框', e:'Mid Frame', col:'#b8c2cd', k:0.00, d:[0,0,0]}, |
| /* 1 */ {n:'视窗玻璃', e:'Front Glass', col:'#1e2a36', k:1.55, d:[0,0,1]}, | /* 1 */ {n:'视窗玻璃', e:'Front Glass', col:'#1e2a36', k:1.55, d:[0,0,1]}, |
| /*16 */ {n:'前面框', e:'Front Bezel', col:'#cbd3dc', k:1.75, d:[0,0,1]} | /*16 */ {n:'前面框', e:'Front Bezel', col:'#cbd3dc', k:1.75, d:[0,0,1]} |
| ]; | ]; |
| var REAR = 3; /* 后盖索引 */ | var REAR_S156 = 3; /* 后盖索引 */ |
| |
| var UI = { | var UI = { |
| cfg=cfg||{}; | cfg=cfg||{}; |
| var L=UI[cfg.lang==='en'?'en':'zh']; | var L=UI[cfg.lang==='en'?'en':'zh']; |
| | var PARTS=cfg.parts||PARTS_S156, REAR=cfg.rear!==undefined?cfg.rear:REAR_S156; |
| if(!document.getElementById('sml3d-css')){ | if(!document.getElementById('sml3d-css')){ |
| var st=document.createElement('style');st.id='sml3d-css';st.textContent=CSS;document.head.appendChild(st); | var st=document.createElement('style');st.id='sml3d-css';st.textContent=CSS;document.head.appendChild(st); |
| +'<div class="ebar"><span class="lb">'+L.exp+'</span><input type="range" min="0" max="100" value="0"><span class="pv">0%</span></div>' | +'<div class="ebar"><span class="lb">'+L.exp+'</span><input type="range" min="0" max="100" value="0"><span class="pv">0%</span></div>' |
| +'<div class="tip"></div>' | +'<div class="tip"></div>' |
| +'<div class="cover"><button class="b">'+L.load+'</button><span class="s">'+L.size+'</span></div>'; | +'<div class="cover"><button class="b">'+L.load+'</button><span class="s">'+(cfg.size||L.size)+'</span></div>'; |
| host.appendChild(root); | host.appendChild(root); |
| |
| var VS=['#version 300 es','in vec3 aP;in vec3 aN;uniform mat4 uP,uV;uniform vec3 uO;out vec3 vP;out vec3 vN;', | var VS=['#version 300 es','in vec3 aP;in vec3 aN;uniform mat4 uP,uV;uniform vec3 uO;out vec3 vP;out vec3 vN;', |
| 'void main(){vec3 p=aP+uO;vP=p;vN=aN;gl_Position=uP*uV*vec4(p,1.0);}'].join('\n'); | 'void main(){vec3 p=aP+uO;vP=p;vN=aN;gl_Position=uP*uV*vec4(p,1.0);}'].join('\n'); |
| var FS=['#version 300 es','precision highp float;in vec3 vP;in vec3 vN;uniform vec3 uC,uE;uniform float uS,uD,uX;out vec4 f;', | var FS=['#version 300 es','precision highp float;in vec3 vP;in vec3 vN;uniform vec3 uC,uE;uniform float uS,uD,uX,uA;uniform mat4 uV;out vec4 f;', |
| 'void main(){vec3 N=normalize(vN),V=normalize(uE-vP);if(dot(N,V)<0.0)N=-N;', | 'void main(){vec3 N=normalize(vN),V=normalize(uE-vP);if(dot(N,V)<0.0)N=-N;', |
| 'vec3 L1=normalize(vec3(-0.45,0.72,0.62)),L2=normalize(vec3(0.72,-0.28,0.44));', | 'mat3 R=mat3(uV);vec3 Nv=normalize(R*N),Vv=normalize(R*V);vec3 L1=normalize(vec3(-0.42,0.58,0.70)),L2=normalize(vec3(0.60,-0.30,0.74));', |
| 'float k1=max(dot(N,L1),0.0),k2=max(dot(N,L2),0.0);vec3 H=normalize(L1+V);', | 'float k1=max(dot(Nv,L1),0.0),k2=max(dot(Nv,L2),0.0);vec3 H=normalize(L1+Vv);', |
| 'float sp=pow(max(dot(N,H),0.0),46.0)*0.30;float rm=pow(1.0-max(dot(N,V),0.0),3.0)*0.20;', | 'float sp=pow(max(dot(Nv,H),0.0),46.0)*0.30;float rm=pow(1.0-max(dot(Nv,Vv),0.0),3.0)*0.20;', |
| 'vec3 c=uC*(0.40+0.66*k1+0.24*k2)+vec3(sp)+vec3(rm)*0.55;', | 'vec3 c=uC*(0.34+0.52*k1+0.20*k2)+vec3(sp)+vec3(rm)*0.55;', |
| 'if(uS>0.5)c=mix(c,vec3(0.12,0.40,0.85),0.34);if(uD>0.5)c=mix(c,vec3(0.72,0.76,0.81),0.62);', | 'if(uS>0.5)c=mix(c,vec3(0.12,0.40,0.85),0.34);if(uX>0.5)c=mix(c,vec3(0.40,0.48,0.58),0.55);else if(uD>0.5)c=mix(c,vec3(0.72,0.76,0.81),0.62);', |
| 'float a=1.0-0.62*uX;if(uD>0.5)a*=0.40;f=vec4(c,a);}'].join('\n'); | 'float a=1.0;if(uD>0.5)a*=mix(0.40,1.0,uX);f=vec4(c,a*uA);}'].join('\n'); |
| function sh(t,s){var o=gl.createShader(t);gl.shaderSource(o,s);gl.compileShader(o); | function sh(t,s){var o=gl.createShader(t);gl.shaderSource(o,s);gl.compileShader(o); |
| if(!gl.getShaderParameter(o,gl.COMPILE_STATUS))throw new Error(gl.getShaderInfoLog(o));return o;} | if(!gl.getShaderParameter(o,gl.COMPILE_STATUS))throw new Error(gl.getShaderInfoLog(o));return o;} |
| gl.attachShader(pr,sh(gl.VERTEX_SHADER,VS));gl.attachShader(pr,sh(gl.FRAGMENT_SHADER,FS)); | gl.attachShader(pr,sh(gl.VERTEX_SHADER,VS));gl.attachShader(pr,sh(gl.FRAGMENT_SHADER,FS)); |
| gl.bindAttribLocation(pr,0,'aP');gl.bindAttribLocation(pr,1,'aN');gl.linkProgram(pr);gl.useProgram(pr); | gl.bindAttribLocation(pr,0,'aP');gl.bindAttribLocation(pr,1,'aN');gl.linkProgram(pr);gl.useProgram(pr); |
| var U={};['uP','uV','uO','uC','uE','uS','uD','uX'].forEach(function(n){U[n]=gl.getUniformLocation(pr,n);}); | var U={};['uP','uV','uO','uC','uE','uS','uD','uX','uA'].forEach(function(n){U[n]=gl.getUniformLocation(pr,n);}); |
| |
| var cam={th:0.60,ph:0.19,dist:3,tgt:[0,0,0],fov:34*Math.PI/180}; | var cam={th:0.60,ph:0.19,dist:3,tgt:[0,0,0],fov:34*Math.PI/180}; |
| gl.viewport(0,0,cv.width,cv.height); | gl.viewport(0,0,cv.width,cv.height); |
| gl.clearColor(0,0,0,0);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT); | gl.clearColor(0,0,0,0);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT); |
| gl.enable(gl.DEPTH_TEST);gl.disable(gl.CULL_FACE);gl.enable(gl.BLEND); | if(xray){gl.disable(gl.DEPTH_TEST);}else{gl.enable(gl.DEPTH_TEST);}gl.disable(gl.CULL_FACE);gl.enable(gl.BLEND); |
| gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); | gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); |
| var e=eye(); | var e=eye(); |
| gl.uniform3fv(U.uO,off(p)); | gl.uniform3fv(U.uO,off(p)); |
| gl.uniform1f(U.uS,p.pi===sel?1:0); | gl.uniform1f(U.uS,p.pi===sel?1:0); |
| gl.uniform1f(U.uD,(any&&p.pi!==sel)||xray?1:0); | gl.uniform1f(U.uD,(any&&p.pi!==sel)?1:0); |
| | gl.uniform1f(U.uA, xray ? (p.pi===sel ? 1.0 : (Math.max(p.size[0],p.size[1],p.size[2])>0.075?0.20:0.62)) : 1.0); |
| gl.uniform1f(U.uX,xray&&p.pi!==sel?1:0); | gl.uniform1f(U.uX,xray&&p.pi!==sel?1:0); |
| gl.drawElements(gl.TRIANGLES,p.count,gl.UNSIGNED_INT,p.start*4); | gl.drawElements(gl.TRIANGLES,p.count,gl.UNSIGNED_INT,p.start*4); |
| cam.tgt=[model.center[0],model.center[1],model.center[2]]; | cam.tgt=[model.center[0],model.center[1],model.center[2]]; |
| cam.dist=fitDist(); | cam.dist=fitDist(); |
| | window.__parts=model.parts; |
| | if(cfg.only!==undefined){model.parts.forEach(function(q){q.vis=q.pi===cfg.only;});} |
| buildList();draw(); | buildList();draw(); |
| if(cfg.boom!==undefined){ | if(cfg.boom!==undefined){ |
| })(); | })(); |
| |
| | </script></html> |
| | <html><script> |
| | /* 3D 拆解视角:捕获阶段接管图库按钮,不改动本页原有的切换脚本 */ |
| | (function () { |
| | var host = document.getElementById('sml-3d'); |
| | if (!host) return; |
| | var stage = host.parentNode, side = document.querySelector('.sml-g-side'); |
| | var v3 = null, on = false; |
| | function parseParts(btn) { |
| | try { |
| | var a = JSON.parse(btn.getAttribute('data-parts') || '[]'); |
| | return a.map(function (r) { return {n: r[0], e: r[1], col: r[2], k: r[3], d: [0, 0, r[4]]}; }); |
| | } catch (e) { return null; } |
| | } |
| | function enter(btn) { |
| | on = true; |
| | stage.className = 'sml-g-stage on3d'; |
| | if (side) side.className = 'sml-g-side on3d'; |
| | if (!v3) { |
| | if (!window.SML3D) return; |
| | v3 = window.SML3D(host, { |
| | url: btn.getAttribute('data-zip'), |
| | lang: btn.getAttribute('data-lang'), |
| | size: btn.getAttribute('data-size'), |
| | parts: parseParts(btn), |
| | rear: +btn.getAttribute('data-rear') |
| | }); |
| | v3.start(); |
| | } |
| | } |
| | function leave() { |
| | if (!on) return; |
| | on = false; |
| | stage.className = 'sml-g-stage'; |
| | if (side) side.className = 'sml-g-side'; |
| | } |
| | document.addEventListener('click', function (e) { |
| | var t = e.target; |
| | while (t && t !== document && !(t.tagName === 'BUTTON' && /sml-g-thumb/.test(t.className))) t = t.parentNode; |
| | if (!t || t === document) return; |
| | if (t.hasAttribute('data-3d')) { |
| | e.preventDefault(); |
| | e.stopPropagation(); |
| | var bs = document.querySelectorAll('button.sml-g-thumb'); |
| | for (var i = 0; i < bs.length; i++) bs[i].className = (bs[i] === t ? 'sml-g-thumb on' : 'sml-g-thumb'); |
| | var cap = document.getElementById('sml-g-cap'), cnt = document.getElementById('sml-g-count'); |
| | if (cnt) cnt.textContent = t.getAttribute('data-idx') + ' / ' + (bs.length < 10 ? '0' + bs.length : bs.length); |
| | if (cap) cap.textContent = t.getAttribute('data-cap'); |
| | enter(t); |
| | } else { |
| | leave(); |
| | } |
| | }, true); |
| | })(); |
| </script></html> | </script></html> |
| |