_aG&BDEJ;x^x=J`G%pH
z5s4)R>yPMt_OaY80u!DNuf94k+ATgrLAKwYLN7->DcVXlD^i`r>H{qVdNuDNrcdK*
zRRJpZT{KvfV`GRVX=0+Ci0qzn*~JqmxhO*Chk*{Gq;p{Q42YpG77+jQZDEWV%Bll$
z@6)MwI#I09rNV6HvDg;$EJ|-w(>SpfzZMDW&|zAkWWAtiOuUKo6TkluKiesflGqRs;s-s$Qn9}OT
zL_cSN33G|TEnHUUMOjXW>RMQTXw}=eDOA!@*TDs0WW}T|M+ucKj4-
zkueuv0b~^@Njp;Pwq4I
zp*XOj*FM?4G|*-~{kx;6&b*h;op>wiBf<9X*b0L_UOc{;8&ufukJb!9XhfELKW*&
zuZO5GB6THKaPYems%9+GJC=<4iLp#8*X99YOb;uW`}fR9qQ|IjgnoBkosySxQ;krjjz&RPf{aR@6s3KKl&>71
z6Kkyo?T;)yZQ+V`NA~Ulm)SOGNxCJ<8xLVXknQdsi76I&OX+rF$OoK^aP*bAwr+7O
z!fOt0)29_;n%glPLYTR0cy!6Jo3jQ!6o$vDB0Mozk@KFF0cNO7yY170Lvdi}b^P`E
zW{OWw$fL`l$@tnRIm+s~u+08RyZe^kf8(YAkp8K7Kjm5TR3DS5nQ9Ruro1*#iOt*j
zUcL(r1mdt=wJ-fRXSXC=|3&PKt-Uz=y$Spvhpx3iMheO0daFC@t%mTSU*K4>dGuPd
zO=_d_Xa|imzZX*a=n#*Y{G)Q)Lt7nN|OR;Zd?tbagz*YiT>
zoR-JKcaIudMcxIw7UA`z{nn1WuAD+gzt7}u51(Q~hTT-bJC(r`qXVb6bV5W=k&^Ma
zD4KIDRvf#sLL|G({9`Hr25!SN#T%FNc*UCyQ)?F)7@=`L_*zz*uD_tU10+^Uiu@+lkSn{CK)3vCo;@nqZsxOfU;91zwscb+
zt~ubbkoQaKx9V5}exiLY`}Edv$Z@W#s
zVA`ktoFd(fgwulcf=T(`>Jio*pB_6zvUS2(vtnS~{?;LNi*Ug@*(cGY}t(*`B{NdVN@E?@=
zSnIs;4%YH3iQddtnHE#Gm>)PFe`AH-;#}xA0(vTg#97zn1cw@jw7Kbi9_cii{r$WB
ztbvo&-r5b0@lTN*`q?s#
zQnGt`$s0!M=k9fKP+;c0=>NK+p6gYO^n&l!%wd=3!mz5^6;B1Fs4Erj&yc)87ccLi
z7FNI)yL&5AMVN1Z88~hpbmnay*J$EHzB++=-TG@bunRybWuK@h%7Xyog2#_OCNMj>
zUD>GU!o&TUh>wQhB^DSlQ?=cdj<-Sl2Uq;0opvqWbRuq>c-+T!;AxjDuaG>uZb`FY
z=R$%u55{*J?@o06a{J8rR!`l}dbInURV>zEtFeCI8sNUVy&L^=Ac%;1;scL@99u@O
zbvtyd<I-6vU$vX2m5>C)2SrdD{8Q
z$shhwFUN=G53vUCCAyuP=-+r^V3TewZineTj8V6#oY4_}b!jL++u2p^$g4pf`6Cwl
zP9|>i{e>&Xu@8_zm&S|-_khmAKm&q5OVQb>jD%#Fjqfv~ShW@VQ+*B_WwO6Aho2rDK*)2z;^dj&PZn43ojDo{3L+_5p+A0lWq#
zAhKKUt!G%qY~ah9+XXu3r`}U>Z=@#p7U?{s&8BKC4~n3BhsK&j4G4A?fG00f**hF
z{i3cnp@#uYnj0YGcVneU;Wq@K6c&HBI$QmV31UtL%18Om$yffnA|vIK%jsq78L;|#
zhBSm|ypA@MR?;QDN&feVp=nd*@6(=mK%sMX$nfu{$A5iO!bu;+wES?5Ph{{uvVK`)
z@&l|2&R1NM;M}A4(5o)fvPZnAkour#Ff(xL?tVl?XP_K*raRo&7Oad_(tq
zGPc-?E(DaT{~Tft)ZiTZY{DwF`m86aG?Ov;-T
z8{E^Ue`2`aWVAU)Kfz1hZis3#wjTmtvQ)ZlMsBNjTj&m!Q>wji<8461>&k{gNrqvf
zt6+;BI-^p6;3&=~yX4*v5;bL;tXS#f#hO$+&ysM^Z4I$_6faf&Qz?wpJQgJDcqDys
z<+lo{Qrw&S)#Pa63n3svg#l*NMb5AmR!HmN==QjV!;{k_g!=~x9flFTa#M(?wg7V<
zD5)9QJFA!-!7%ntj*p0`lUb4(?X~VtPw=JLt~6Scn}o4A0Wpb#Xa7T}>U&Cz#c+((
z{V=7wmH+nl*kW2nI
z9p7|cc6R#Q#ghJYm-eA3kqfOp`MGE;e@i1cPMTNTnwRhJdCMDWRV9>`
z6?sVzgZ<%5=$y@OYQ^ZIzO<4^Gs0?$IqisnJ+J9<3tqxt-qkkes%f=lVXq3dRoI|JDT8C7Q~VA=z8j
zh%S(Zg{^O^#|HqNu+Wl=&e&IG`qPovRE@G^()KQ
z;)i=P=}TJWM~c~5jXy(YF^!nMf7do2sB>ems^rexr%=0v_NL;zk~q5E1?D>)<3kBY
zWW$*P7Vid(T%9O*3|_wNTq#=L6!hg_bCh+*OPa_C(X?=5&D^abQ@P)=Wg(-nIW1da
z-t#*bJ~y@cDfn)+4dDE*4^+EwTo1Ra;C{`sLGSVIUX;@{j}3sjs&BOVbDvAL
z2QAYm8%+5T3m~ytP?`Mk7OS~rENl3Vm(PYr+Syy)sf^p~Dnm`-;h`KK-eC_i2~R3!
zHF;6VHvh3+L%n{QSiu9XbVRU=VQudwUKx3O*tTfROz6eVGv0yJf^tiN_|a;lG)6(!
z480zh@(Uyi8^yZh
zCUP4FOl>aZv60y&ykSqG!113pG1pQl8x!-%M+(q2{bf`75~WreAo=q0;G@U-aUb#=
zN8z>Zpz&HsPT<8Bey+?_D-n&?
z*;rZ@e@MWCdlbPhRaw_}BnnGbaO=9NCUB5SmyFOj;&ET~IqQRIcrJg6%w+9F
zjlQ{5pnu+j9l|4@(m1&fhn~mj-}36+>XI1UGxQaHFUfOpjTgTwj^0R_k!|otEOa&~
z_kRl7=QD7$O9=rRX0fb>CNjcvtuAyYdi&a{#v32(irg5AA=X732rqC(c3=9|c)hRb
zqex?WQrz&@DI;phMd@hQ@IDsyPi=B1y9b`>teK>b4HaBNii!jx9T3K>`?7}$9;Die
zJ);Bv1b87`kB4?yc@CXkEYJvJ{J*ZnT1nM^15|r-$e6w2*1Zr
zs`F@mBBc|U{P~`#CmM=Jo}Wptt^43R+wgX3T>9p<_fH6m4s_W0KAPf9y$91yD+Nw^
z_=@En^e76;Xgv1vOwadvI(;vBqGXAGX`3{4fU#qgrOsu|WK(%j2BZSqCQn1^nN*fs
zSVk{SE}W6A{FY7R1QgM2x#n^BZbzGidEq32qXZ^}-&jKTL;_uU`_pgjl6Qs?t!
zlvliZyh!1HehoX{0d>ahe$$DKQH0l-+cOaM=5{fmsM3^!`!8HMYSLi0QUFNV($?-G!
zQE3y^Y&kH^{;O0Yah|0ubN@w}De2JI*I3Cx&v-AzX>Qc-2hUD;V>O(w`F%z6-6Ss~
zM;?D}MNQkUB%Z$3V*Q98rK6eGEMQ^g!wziJey(vDvf3W9sout}?$Fi3el@o`8`P-@I-&7bRvd30r^sZ*enmX$N0N1^xU&c)6;4_89@%>1JDHUF`lo
z0GscD4@XQjzhrNuYwvi#G4a}UUVkknp94Btnz|_=#wusWD?>ag)?F$sgO;L4LtDqg
zsu)4=mrMOP<|0dU#RRNzt5nN{ySLu(dVVzo#;T!0ln(Q<3F?eWcIgX
zCD<}YH8zgf$h_{ER8#tk0uy->KL+PW=7Yo0}uVDZaDW){KTNOKV)gV
zJfPWO7MW5?6=R>!bL(0sIE`WSCH-dc*A@X^fSn);8s}Bl_>0ZjThR*@R^^>6^)>R1
zYkh)E(H8a=p|B2##*?>d(8Xx6;LsLVJYf$S2^L&S3K+OxP*UOV$h;gXywhHL)Mapc>vK@Lr^`b3N`vNC>Z2LpSpB#@KC}@e8H2eC>@0g|fcg$^AH{$v^yMJ|u
zsL)!`h_0K*+4afXnxetPPkN3GPGs|j=C1mUogVsRjk&jvsgSko&@j4aQ>2em#%&dv
zFiPIQY2rbofE8J?7AJPYP(rz!WhWwEM4?8Bl7(b^6$>9HY~-|`J+e8T-xR`30!hJN
z??)ic=&th8%4gY<$?<=WrHRs2{*q_;z!7`$v8(qrqx-Y&TMpWP&c81^XLhTh?(ca6
zmmIEgAmPD=2J4WYg~=JCI=yT?3%xYyndg?WYkeWu+-p^H+})m4$k1kQc+FXbNh-Uq
zQFgPVez<^6XLGl(`LD=vxSa6`99rB%qa$tl%!L=2VBCCi&HPj*fxLQbqIpv%snh_d
zLf|O@`++~U;<3#p1ju266$P}?ln*+{b0E&Sl|4_!k0swJxFn}JDQyuqpgi~P<51ji
zTtt5GL)4qg&trCN)d5C7O_cp&O#sZ0!#oa@lkizx2Y1=$JW?X${3`!gSFPH`#915N{e^#`L
z`NLpHI4TLFnB*vi(!_I#aMdUS;Aly
zxv${lSt?ijydMVcN~y7zz~ZS79_tHqp38k#d*bI`la*fHN4?Px)%E
zR(JIN$SFAOKDr>c>vV2!xp`VQt>(+PotWy>y{?*ToqbJTOZF5!Lf`r=YZDvqkEzJS
zcWh$v;U-Qx4{Zg)=Q?dTN6xod*3m)g`?C_a8xiMuS^
zolm5*aH2-_X}FG#!4z3YKM(NnyVmgxuz5nHfW9nA``L^~FH{*)N3M!SYpB%gvr3mF
z7aMD>%M7IU9_dmhM90PEA-v~~e)Lle^vZ&`iE60$(lXq^DCzv1E6M)F6iv%)NKTk<
zZ7VC#o7EMJ&JXSucib|@x#Ch8Z{QO!sqlt23~jp%CZ`_B?9m99zTB(00kRO5OTmMu
z$kA=MQ47HRLbMl1*tG6V5w(7?0j~aCGXX5B8E_ezTa=i58%fA*l3T0Mj3O$>dMzITt}aJ&P+U(LIZF-|G%UYmkxC2@jm>x}jER_UqQi41kz6|#
zO6|=saTT{<+b5Lg2W?tk&;AF5Ry7%;0ALgCBu^N6`d+P(;>yV`uQo%@&kR5~o;+_|
z{bTZ{q66aMcS;@pxr|&v&~oYcWB%NWkoAf1yn*7kM2VYcV*lJW`ywh^)ff}
z3&1rkn=|oTSFN*fY4%p%6*i0Z#;f=WgAdf2BgopXPlFUh|_?J#4tNJwy+xaQ~yYJMC
zxJrTJy_=ONYHvH6x7p;Huu^-R&R>{qL}Rf}qkOd1#>VJ=;!S2PkLEtP>3b+0#2-`i
zI$}TJ75K4HB4fPMO8YEoGnPXw&MLrbB*yo~zo32Ce=kHI{%MO;i!n8@<)QM_Yk0q}
zMZV8JGRlH%H~G`_tv@`k9eUu`Cadf{KtQPuKXI=~yHSI%>Zu%qPDTEH;AC9-UE7@_
zKK9GwSx*%*vfOy*OG0ZIZqAc&Q^7*K4r%x1?1)#8H4RI}W!8Gi7kUtr?1yZX0s#yX`b_q0_|
zej7W=boW}5k4H+W-|DM72)!!#hS3yBA~
z|32pS*c)wK>+Fo%AZc+OhCeDnpPP09&bO4EJi^me+%O72prrYC@N`+yMD;iAz}xH&
z+b&CmOPwfHZ?#JyPN~#`=-6mp(7tmH^8In-RP#FUr}BrJGs~5LZQI9GD%}F=iCV5o
zXXUgQ8909_Blx^eTSs5`yAN?(M5^>&`FL;X8pO#bG^azVgE*gqz+S
zCe-{^g$0CR=Yt#OvJ4{>Uj8ngjQH=^fvaL0W-DEan~qAdaAK5nF_5AU!$>Mz6*g|h
zZT+SRSZF0`%iz93Zb+m1Z$9l-BGq^QVE9L5>s@Rwtpunrg!4$mi^C!Ml8#^I6#3XE
z_Y%e8Mf9ik`~juGFGi1eMZ?Xg!$huSmc_D*J)u)
z4cSzuOc$*?Hh_(EzOg}zjf0s6^>JP5WJAxBV3p}Kz+NSFxL)rfGkAoK&C_Y5GrclHD?mKz?c6;5|PQMLoDJ_0y9a25Ml!VbV>@C
zxGb$JLTC{JlyGtciPBdjax~Aup78z}5OL5oB2&W6|93-A0-{BnlWLWGLQD8)waAh{
zqqyTdC3$p1m4IRCeBZ>&3i-s{rwQOhsn74T^6K#Ay5f|n5Eff
zr*cH?2v-nIs&tN1j?a?CY%87w?N`-e@aS{yk~(*JAWc%&DkstFw{WL~#m6RWCLwK-
zA$ePtunk6aD4TCqCgTo+8cEng1?T)I1E`h5!|}Mwd-%Bk%yCJ5BY{b#
z&4N&+e^oebLP`HhXtcv=#zsO6o_JfS=
z5;rE~(xjPNol5up20eek=$jK|7FrTVFk=x)?k8{H89YI#u18BTOr^wAst<9I`ME}c
zm^RMzVe<5uB$w6KV40VKlv=mjRXVDY|BP!C~{wxG9SD0w57DSOvUVm
zYa|W~$2kgrl4(whv)^`iLJxxi!{K3c_1-yN~imrmH*A#}6JLhj1
z#-On$C-J$!i&KXAJ%RK$USzK?DoZB%mGWfK_Xm*7M!`Z0#%*isY*s?61E_Z5;^Ni
zIWZ+qBvuble%0Lne&TA)czH!l<2I?tn`hu4fnN+jZZh5!k^y9puLIvu42VMv6+g~zYE
z!pbCS=JJ3nxd-Z&)yN6u4ruCp`Q_j^D`~y@IlWk#>Y9UkmqYB^NY$gnPu6be=hv(E
zQ;))G=l`I|;
z)FC%{1W~KLc+uJ5r&$xh+5m71h5WOHCNnL#P7u-DWJpS7tB>?nKLypC-Y~Wszh_zM
zq(Dg9dHzj6JCs0+B6M_l#tk8E6|k*RJv8-wC$5nuWLpe_N4xu?W)@|_6L_REU#F%v
zR6!RSBMEFciF+q^Z^-NZ&K!Z#yezaNA+^zYFeN{GkXhBwQ}%j-duLhN*O{uj>}@HJ
zn!&k5)JiaQQ0aYg)4PkhSE^Bm>Mn0x@NWE7221Y9IIqpwnD^}{csp-ZNFLmp6^d6D
zQzc%X+`TCa{`s2f*sBLVNv|zZQ2BEb)bb|3(okvYs8foGzd^wqE+`R2>q(1+6
zN`LS9I3ZaM^Z|c>wG2QzAOtt5@C-?x6lK5@;rs}0fB%(NVXW*8HO;y1e{4ouZo3s`
zN_OGDlV~_=5*5X7rV|_Cu7ZL_r;{|X
zUFnu9b2upSo-7c0Z~(y0{5Y?xiw9wDv`8cA+ACv6D`hRsIUlX*ARXFQ3u#M5K&4o3
z8GVbFS3N8VM
z0tFYErKEB7oE|u-Jqr%$w$thNH-ttPahg|pb%*d;X*m^-9ZQ!LNah;JvHl?x#jIrN
zL!FNAh#_qW)9>)K&xgbol5ii)8;Y2oX!9yap!z97`hJ*&wD#5`@f6b}JuYij;+m!G
zCaoZr%FS7;n6_DLzBWTMcs>yj#yV7ng`V~>@`thx)-|(
z@amOq|9m3@aL^dA@)3hMmxz|gRgkc2jAk|;^Tri7n(&xIu-(n-!I$AmTA4J
z_Qw(1r_de(wUV@4!w@7bks+fVB921$ra(lSx?ul?A%xWV-bo
zoi4>bh*F=I(tpEfMbxd7C
zQ{8!CT1(8)yLe6bIfa(Dpz2S$fQD?<>`L<0(P?z!ge!}OTde@HMkuJSK6(XIXua?P9t6V^=m6hYR
zWULMoK?S)6KHr6NYEN4j{DB0zg0nlbU7y1TeZv1Wvy-Pj479bieE=oq{~vYj{|DuK
e(Z56`u@X?#+Jp)*F9gN-fVaE9Ta9b@o&NzgZujB<
literal 0
HcmV?d00001
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..d89bb7e
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
diff --git a/src/assets/vue.svg b/src/assets/vue.svg
new file mode 100644
index 0000000..770e9d3
--- /dev/null
+++ b/src/assets/vue.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/helloworld/HelloWorld.less b/src/components/helloworld/HelloWorld.less
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/helloworld/HelloWorld.ts b/src/components/helloworld/HelloWorld.ts
new file mode 100644
index 0000000..a0f6ca5
--- /dev/null
+++ b/src/components/helloworld/HelloWorld.ts
@@ -0,0 +1,14 @@
+import { defineComponent } from 'vue'
+
+export default defineComponent({
+ name: 'HelloWorld',
+ // setup(props, context) {
+ setup() {
+ // const renderCanvasRef = ref()
+ // const isPopupViewChangeOption = ref(false)
+ // const buttonsColorStatus = ref>([true, false, false, false])
+
+ return {
+ }
+ }
+})
diff --git a/src/components/helloworld/HelloWorld.vue b/src/components/helloworld/HelloWorld.vue
new file mode 100644
index 0000000..294a7e2
--- /dev/null
+++ b/src/components/helloworld/HelloWorld.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+ Edit
+ components/HelloWorld.vue to test HMR
+
+
+
+
+ Check out
+ create-vue, the official Vue + Vite starter
+
+
+ Learn more about IDE Support for Vue in the
+ Vue Docs Scaling up Guide.
+
+ Click on the Vite and Vue logos to learn more
+
+
+
+
+
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..a265a53
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,21 @@
+import { createApp } from 'vue'
+import './style.css'
+import App from './App.vue'
+
+
+import router from './router'
+
+// 1. 引入你需要的Vant组件
+import * as vant from 'vant'
+// 2. 引入Vant组件样式
+import 'vant/lib/index.css'
+
+
+
+const app = createApp(App)
+
+app.use(router)
+
+app.use(vant)
+
+app.mount('#app')
diff --git a/src/pages/index/Index.less b/src/pages/index/Index.less
new file mode 100644
index 0000000..9fffd91
--- /dev/null
+++ b/src/pages/index/Index.less
@@ -0,0 +1,182 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Helvetica Neue', Arial, sans-serif;
+ line-height: 1.6;
+ color: #fff;
+ background-color: #121212;
+ overflow: hidden;
+}
+
+/* 导航栏 */
+.nav {
+ background-color: rgba(30, 30, 30, 0.9);
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 1000;
+ padding: 1rem 0;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.nav__list {
+ list-style-type: none;
+ display: flex;
+ justify-content: center;
+}
+
+.nav__item {
+ margin: 0 1.5rem;
+}
+
+.nav__link {
+ color: #fff;
+ text-decoration: none;
+ transition: color 0.3s ease;
+ user-select: none;
+}
+
+.nav__link:hover {
+ color: #aaa;
+}
+
+/* 3D 场景容器 */
+.canvas3d {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100vh;
+ z-index: -1;
+}
+
+/* 主视觉区域 */
+.hero {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+ color: #fff;
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
+}
+
+.hero__title {
+ font-size: 3.5rem;
+ margin-bottom: 1rem;
+ user-select: none;
+}
+
+.hero__subtitle {
+ font-size: 1.5rem;
+ margin-bottom: 2rem;
+ user-select: none;
+}
+
+.hero__btn {
+ background-color: #007aff;
+ color: white;
+ padding: 1rem 2rem;
+ border: none;
+ border-radius: 5px;
+ text-decoration: none;
+ font-size: 1.2rem;
+ transition: background-color 0.3s ease;
+ user-select: none;
+}
+
+.hero__btn:hover {
+ background-color: #0056b3;
+}
+
+/* 特色介绍区域 */
+.features {
+ position: relative;
+ padding: 5rem 0;
+ text-align: center;
+ background-color: rgba(30, 30, 30, 0.9);
+ color: #fff;
+ box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.features__title {
+ font-size: 2.5rem;
+ margin-bottom: 3rem;
+ user-select: none;
+}
+
+.features__list {
+ display: flex;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+.features__item {
+ width: 300px;
+ margin: 2rem;
+}
+
+.features__icon {
+ font-size: 3rem;
+ color: #007aff;
+ margin-bottom: 1rem;
+ user-select: none;
+}
+
+.features__item-title {
+ font-size: 1.5rem;
+ margin-bottom: 1rem;
+ user-select: none;
+}
+
+.features__item-description {
+ color: #aaa;
+ user-select: none;
+}
+
+/* 底部区域 */
+.footer {
+ background-color: rgba(30, 30, 30, 0.9);
+ padding: 2rem 0;
+ text-align: center;
+ color: #aaa;
+ box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.footer__text {
+ color: #aaa;
+ user-select: none;
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+ .nav {
+ display: none;
+ }
+ .nav__list {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .nav__item {
+ margin: 0.5rem 0;
+ }
+
+ .hero__title {
+ font-size: 2.5rem;
+ }
+
+ .hero__subtitle {
+ font-size: 1.2rem;
+ }
+
+ .features__item {
+ width: 100%;
+ }
+}
diff --git a/src/pages/index/Index.ts b/src/pages/index/Index.ts
new file mode 100644
index 0000000..247711d
--- /dev/null
+++ b/src/pages/index/Index.ts
@@ -0,0 +1,211 @@
+import { defineComponent, onMounted, ref } from 'vue'
+import * as BABYLON from '@babylonjs/core/Legacy/legacy'
+
+export default defineComponent({
+ name: 'Index',
+ // setup(props, context) {
+ setup() {
+ const canvas3d = ref()
+ // const isPopupViewChangeOption = ref(false)
+ // const buttonsColorStatus = ref>([true, false, false, false])
+
+ const init = () => {
+ // 创建引擎
+ const engine = new BABYLON.Engine(canvas3d.value!, true);
+
+ // 创建场景
+ const createScene = function () {
+ const scene = new BABYLON.Scene(engine);
+ // 设置场景背景色为暗色系
+ scene.clearColor = BABYLON.Color4.FromHexString("#121212ff");
+
+ // 创建相机
+ const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 5, new BABYLON.Vector3(0, 0, 0), scene);
+ camera.attachControl(canvas3d, true);
+
+ // 创建光源
+ new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);
+
+
+ // 定义顶点着色器
+ const vertexShader = `
+ precision highp float;
+
+ // Attributes
+ attribute vec3 position;
+ attribute vec2 uv;
+
+ // Uniforms
+ uniform mat4 worldViewProjection;
+
+ // Varying
+ varying vec2 vUV;
+
+ void main(void) {
+ gl_Position = worldViewProjection * vec4(position, 1.0);
+ vUV = uv;
+ }
+ `;
+
+ // 定义片段着色器
+ const fragmentShader = `
+ precision highp float;
+
+ // Varying
+ varying vec2 vUV;
+
+ // Uniforms
+ uniform float time;
+
+ void main(void) {
+ // 计算流光效果
+ float wave = sin(vUV.x * 10.0 + time * 2.0);
+ float glow = (wave + 1.0) * 0.5;
+
+ // 基础颜色(半透明蓝色)
+ vec4 baseColor = vec4(0.0, 0.2, 0.8, 0.5);
+
+ // 应用流光效果
+ vec4 finalColor = baseColor + vec4(glow, glow, glow, 0.0);
+
+ gl_FragColor = finalColor;
+ }
+ `;
+
+ const customMaterial = new BABYLON.ShaderMaterial("customShader", scene, {
+ vertexSource: vertexShader,
+ fragmentSource: fragmentShader,
+ }, {
+ attributes: ["position", "uv"],
+ uniforms: ["worldViewProjection", "time"]
+ });
+
+ // 设置材质透明度
+ customMaterial.alpha = 0.95;
+
+ // 创建更扁平、更小的莫比乌斯环
+ const mobius = BABYLON.MeshBuilder.CreateTorusKnot("mobius", {
+ radius: 0.3,
+ tube: 0.05,
+ radialSegments: 128,
+ tubularSegments: 128,
+ p: 2,
+ q: 3
+ }, scene);
+ mobius.position.y = 1;
+ // 将材质应用到莫比乌斯环
+ mobius.material = customMaterial;
+
+ // 将时间变量传递给着色器
+ let time = 0;
+ scene.registerBeforeRender(() => {
+ customMaterial.setFloat("time", time);
+ time += 0.01;
+ });
+
+ // 创建点光源
+ const pointLight = new BABYLON.PointLight("pointLight", new BABYLON.Vector3(0, 2, 2), scene);
+ pointLight.diffuse = new BABYLON.Color3(1, 1, 1);
+ pointLight.specular = new BABYLON.Color3(1, 1, 1);
+
+ // 让点光源围绕莫比乌斯环旋转
+ scene.registerBeforeRender(() => {
+ mobius.rotation.y += 0.01;
+ const angle = performance.now() * 0.001;
+ pointLight.position = new BABYLON.Vector3(
+ Math.cos(angle) * 2,
+ 2,
+ Math.sin(angle) * 2
+ );
+ });
+
+
+ // 创建星空粒子系统
+ const starSystem = new BABYLON.ParticleSystem("starSystem", 10000, scene);
+ starSystem.particleTexture = new BABYLON.Texture("./img/flare.png", scene);
+ starSystem.emitter = new BABYLON.Vector3(0, 0, 0);
+ starSystem.minEmitBox = new BABYLON.Vector3(-100, -100, -100);
+ starSystem.maxEmitBox = new BABYLON.Vector3(100, 100, 100);
+ starSystem.color1 = new BABYLON.Color4(1, 1, 1, 1);
+ starSystem.color2 = new BABYLON.Color4(1, 1, 1, 1);
+ starSystem.colorDead = new BABYLON.Color4(1, 1, 1, 0);
+ starSystem.minSize = 0.05;
+ starSystem.maxSize = 0.2;
+ starSystem.minLifeTime = 1;
+ starSystem.maxLifeTime = 3;
+ starSystem.emitRate = 1000;
+ starSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;
+ starSystem.gravity = new BABYLON.Vector3(0, 0, 0);
+ starSystem.direction1 = new BABYLON.Vector3(-1, -1, -1);
+ starSystem.direction2 = new BABYLON.Vector3(1, 1, 1);
+ starSystem.minAngularSpeed = 0;
+ starSystem.maxAngularSpeed = Math.PI;
+ starSystem.minEmitPower = 1;
+ starSystem.maxEmitPower = 3;
+ starSystem.updateSpeed = 0.01;
+
+ // 启动星空粒子系统
+ starSystem.start();
+
+ // 应用材质到莫比乌斯环
+ // mobius.material = customMaterial;
+
+
+
+ // starSystem.updateFunction = (particles) => {
+ // const center = mobius.position;
+ // for (let i = 0; i < particles.length; i++) {
+ // const particle = particles[i];
+ // const distance = BABYLON.Vector3.Distance(particle.position, center);
+ // const angle = Math.atan2(particle.position.z - center.z, particle.position.x - center.x);
+ // const newAngle = angle + 0.01;
+ // particle.position.x = center.x + distance * Math.cos(newAngle);
+ // particle.position.z = center.z + distance * Math.sin(newAngle);
+ // }
+ // };
+
+ // // 添加后处理效果
+ // const defaultPipeline = new BABYLON.DefaultRenderingPipeline(
+ // "defaultPipeline",
+ // true, // 是否启用HDR
+ // scene,
+ // [scene.activeCamera!], // 应用到的相机
+ // true
+ // )
+
+ // defaultPipeline.bloomEnabled = false//!isMobile // 启用泛光效果
+ // defaultPipeline.bloomThreshold = 0.9 // 泛光阈值
+ // defaultPipeline.bloomWeight = 0.3 // 泛光权重
+ // defaultPipeline.bloomKernel = 64 // 泛光内核大小
+ // defaultPipeline.bloomScale = 0.5 // 泛光缩放
+
+ // defaultPipeline.glowLayerEnabled = true
+ // defaultPipeline.glowLayer!.intensity = 1.2//isMobile ? 0.7 : 0.66
+
+ // defaultPipeline.imageProcessingEnabled = false
+
+ return scene;
+ };
+
+ const scene = createScene();
+
+ // 渲染循环
+ engine.runRenderLoop(function () {
+ scene.render();
+ });
+
+ // 响应式处理,当窗口大小改变时更新引擎
+ window.addEventListener('resize', function () {
+ engine.resize();
+ });
+ }
+
+ onMounted(() => {
+ init()
+ })
+
+ return {
+ canvas3d
+ }
+ }
+})
diff --git a/src/pages/index/Index.vue b/src/pages/index/Index.vue
new file mode 100644
index 0000000..5e5b40f
--- /dev/null
+++ b/src/pages/index/Index.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 3D 展示主题
+ 探索精彩的 3D 世界
+ 了解更多
+
+
+
+
+ 3D 展示特色
+
+
+
🚀
+
沉浸式体验
+
通过 3D 技术,带来身临其境的视觉享受。
+
+
+
🌟
+
逼真效果
+
呈现逼真的 3D 模型和场景。
+
+
+
🛡️
+
互动性强
+
支持用户与 3D 内容进行互动。
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..b89d3de
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,24 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+// import { defineAsyncComponent, markRaw } from 'vue'
+
+const router = createRouter({
+ history: createWebHashHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/',
+ name: 'index',
+ component:
+ // markRaw(
+ // defineAsyncComponent(() => import('@/components/3d/show360/ShowObject360.vue'))
+ // ) //当前显示的组件
+ () => import('@/pages/index/Index.vue')
+ },
+ // {
+ // path: '/',
+ // name: 'vrroom',
+ // component: () => import('@/components/3d/vrroom/ShowVrRoom.vue')
+ // }
+ ]
+})
+
+export default router
diff --git a/src/style.css b/src/style.css
new file mode 100644
index 0000000..f691315
--- /dev/null
+++ b/src/style.css
@@ -0,0 +1,79 @@
+:root {
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+.card {
+ padding: 2em;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 0000000..771a57b
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,21 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
+ "compilerOptions": {
+ "incremental": true, // 启用增量编译
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ // "noUncheckedSideEffectImports": true
+ "baseUrl": ".",
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ]
+ }
+ },
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..bcf0aef
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "incremental": true, // 启用增量编译
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ // "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..7eaec3c
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import { fileURLToPath, URL } from 'node:url'
+
+// https://vite.dev/config/
+export default defineConfig({
+ base: "./",
+ plugins: [vue()],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})