برنامه نویسی

Claude 3.7 Sonnet Thinking در مقابل Deepseek R1: تجزیه و تحلیل کامل

بنابراین ، سرانجام Anthropic سکوت را شکست و Claude 3.7 Sonnet را منتشر کرد ، یک مدل ترکیبی که می تواند مانند یک مدل تفکر برای کارهای استدلال پیچیده فکر کند و فوراً مانند یک مدل پایه پاسخ دهد.

از معیارهای Arc-Agi ، غزل 3.7 Claude با Thinking با O3-Mini-High برای زمینه 16K به ثمر رسیده است. و R1 با مدل غزل پایه مقایسه می شود. انسان شناسی مطمئناً کار بزرگی انجام داده است.

برای مرجع ، Deepseek R1 حدود 15 ٪ به ثمر رساند.

معیار ARC-AGI برای 3.7 غزل و R1

اما مدتی است که از Deepseek R1 استفاده کرده ام و کارهای بسیاری را انجام می دهد که مهم است. بنابراین ، من کنجکاو بودم که چگونه در برابر غزل جدید Claude 3.7 جمع می شود.
من هر دو مدل را در میان وظایف مانند استدلال پیچیده ، ریاضیات ، برنامه نویسی و نوشتن مقایسه خواهم کرد.

بنابراین ، بیایید شروع کنیم.


فهرست مطالب

  1. Claude 3.7 Sonnet در مقابل Deepseek R1
  2. استدلال پیچیده
  3. ریاضیات
  4. برنامه نویسی
  5. نوشتن
  6. حکم نهایی

TL ؛

• Claude و Deepseek R1 هم برای استدلال روزانه و کارهای ریاضی در همان توپ قرار می گیرند.
• همانطور که به صراحت به انسان شناسی اشاره شد ، آنها مدل را برای موارد استفاده عملی آموزش داده اند. این همچنین در آزمایشات منعکس شده است.
• عملکرد بسیار بهتر از Deepseek R1 در بخش برنامه نویسی است. مقایسه چندانی وجود ندارد.
• کلود در نوشتن فنی خوب است ، در حالی که Deepseek R1 مانند انسان تر است.


Claude 3.7 Sonnet در مقابل Deepseek R1

این جنایتکار خواهد بود که قیمت گذاری را قبل از هر مقایسه در نظر نگیرید. این برای بسیاری از کاربران ، به ویژه آنهایی که در بالای آنها ایجاد می کنند مهم است.

قیمت گذاری Deepseek R1
• نشانه های ورودی (ضربه حافظه نهان): 0.14 دلار در هر میلیون نشانه
• نشانه های ورودی (حافظه پنهان): 0.55 دلار در هر میلیون توکن
• نشانه های خروجی: 2.19 دلار در هر میلیون توکن
Claude 3.7 قیمت گذاری غزل
• نشانه های ورودی: 3.00 دلار در هر میلیون نشانه
• نشانه های خروجی: 15.00 دلار در هر میلیون توکن
از دیدگاه هزینه ، Deepseek R1 هنوز پادشاه است. این امر آن را به یک جانور مطلق برای قابلیت های استدلال که ارائه می دهد تبدیل می کند. همچنین منبع باز است ، و می توانید آن را بر روی سخت افزار خود میزبانی کنید ، که برای شرکتهای حساس به حریم خصوصی نیز مهم است.

اما توانایی خام نیز اهمیت دارد. بنابراین ، بیایید این دو مدل را با هم مقایسه کنیم.


استدلال پیچیده

1. معما برای قضاوت در مورد تعصب شناختی

این یک سؤال ساده است ، اما بیشتر مدل هایی که من سعی کرده ام پاسخ ندهند.

سریع: یک زن و پسرش در یک تصادف رانندگی هستند. این زن متأسفانه کشته شده است. پسر به بیمارستان منتقل می شود. وقتی پزشک پسر را می بیند ، می گوید: “من نمی توانم روی این کودک فعالیت کنم. او پسرم است! چگونه این امکان پذیر است؟

Claude andceing Ridles

من این سوال را پیچیده ام ، و از هم پاشیده است.
*سریع: جراح ، که پدر پسر است ، می گوید: “من نمی توانم روی این کودک فعالیت کنم. او پسر من است “، که جراح این کودک است. سر راست باشید “.
*

https%3A%2F%2Fdev to” loading=”lazy” width=”800″ height=”365″/>

همین مورد با Deepseek R1 نیز همین مورد بود. این به سوال من برای مدل های استدلال چک و چک تبدیل شده است.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0flr9fpib1kf56bwcse” loading=”lazy” width=”800″ height=”232″/>

2. رابطه خون

*سریع: جف دو برادر دارد و هر یک از برادرانش سه خواهر دارند. هر یک از خواهران دارای چهار برادر پله و پنج خواهر ناپدری هستند که در کل هشت خواهر و برادر در این خانواده دارند.
*

خروجی کلود شبیه به Deepseek و حتی O3-Mini بود.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gvkol3mbw46bja6jy5u” loading=”lazy” width=”800″ height=”370″/>

با این حال ، Deepseek R1 ، طبق معمول ، دارای سنگهای قیمتی در تختخواب است. گرچه خروجی اشتباه بود ، اما در زنجیره فکری خود درست شد.

https%3A%2F%2Fdev to” loading=”lazy” width=”800″ height=”372″/>

3. بازی Tic-Tac-Toe

من از کلود خواستم حرکت بعدی را انجام دهد که پیروزی آن را تضمین می کند. من انتظار داشتم که آن را به درستی پاسخ دهد ، اما شکست خورد.

Claude بازی Tic-Tac-Toe

Deepseek R1 یک مدل چند منظوره نیست.


ریاضیات

1. GCD این مجموعه مجموعه {n^99 (n^60-1) را پیدا کنید: n> 1}

این یک سؤال نسبتاً دشوار بود و کلود نتوانست آن را حل کند.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopsupvqsqf3a51cde3r3” loading=”lazy” width=”800″ height=”545″/>

با این حال ، Deepseek R1 در نقطه ای بود.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffoo1947uwwlmnvm67y91” loading=”lazy” width=”800″ height=”445″/>

2. (x-14)^10 را پیدا کنید ، جایی که x تعداد واکه ها در پاسخ است

Claude 3.7 Sonnet توانست به درستی به آن پاسخ دهد.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubqfvpsgf8knn3yorolm” loading=”lazy” width=”800″ height=”369″/>

Deepseek R1 نتوانست آن را به درستی بدست آورد.

Deepseek R1 پاسخ دادن به ریاضی

خلاصه ریاضی

توانایی ریاضی یک کیسه مختلط است. شما هرگز نمی توانید با هم اشتباه کنید ، اما هزینه به عملکرد Deepseek باعث می شود آن را بی نظیر کند. اما ، خوب ، کلود باهوش است و Deepseek nerdier است.


برنامه نویسی

برنامه نویسی همیشه دامنه کلود بوده است. آنها حتی به طور خاص مدل ها را در مورد رمزگذاری نشانه ها آموزش می دهند تا آنها را عزیز توسعه دهنده بسازند. این کلود در-نیمکت است.

کلود روی نیمکت SWE

اما بیایید هر دو را مقایسه کنیم.

1. ایجاد SVG

این یک آزمایش جالب است ؛ من آن را از سیمون ویلیسون انتخاب کردم.

*سریع: یک SVG از یک اسب شاخدار در این زمینه ایجاد کنید.
*

و این پاسخ کلود بود.

Claude ایجاد SVG

SVG کلود

از Deepseek R1.

SVG Deepseek

Deepseek نقاشی تک شاخ
آفرینش کلود با پیشینه و دید بهتر کمی بهتر است. Deepseek مناسب و معقول است ، اما واقعاً در آنجا نیست.

4. توپ در یک شیء هندسی

سریع: یک اسکریپت پایتون را برای 10 توپ در داخل یک شش ضلعی سریع برای من بنویسید.

کد شبیه سازی

import pygame
import math
import sys

# Initialize Pygame
pygame.init()

# Screen settings
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Spinning Hexagon with Balls")

# Colors
BACKGROUND_COLOR = (0, 0, 0)
HEXAGON_COLOR = (255, 255, 255)
BALL_COLOR = (255, 0, 0)

# Center coordinates
CENTER = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)

# Hexagon parameters
HEX_RADIUS = 200  # Distance from center to vertices
ROTATION_SPEED = 0.15  # Radians per frame

# Ball parameters
NUM_BALLS = 10
BALL_RADIUS = 10
BALL_ORBIT_RADIUS = 150  # Distance from center for ball positions

# Initialize rotation angle
angle = 0

# Main loop
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Clear screen
    screen.fill(BACKGROUND_COLOR)

    # Update rotation angle
    angle += ROTATION_SPEED

    # Draw hexagon
    hex_points = []
    for i in range(6):
        theta = angle + i * math.pi / 3  # 60 degrees between vertices
        x = CENTER[0] + HEX_RADIUS * math.cos(theta)
        y = CENTER[1] + HEX_RADIUS * math.sin(theta)
        hex_points.append((x, y))
    pygame.draw.polygon(screen, HEXAGON_COLOR, hex_points, 2)

    # Draw balls
    for i in range(NUM_BALLS):
        ball_angle = angle + (2 * math.pi * i) / NUM_BALLS
        x = CENTER[0] + BALL_ORBIT_RADIUS * math.cos(ball_angle)
        y = CENTER[1] + BALL_ORBIT_RADIUS * math.sin(ball_angle)
        pygame.draw.circle(screen, BALL_COLOR, (int(x), int(y)), BALL_RADIUS)

    # Update display
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خروجی Deepseek R1

import pygame
import math
import sys

# Initialize Pygame
pygame.init()

# Screen settings
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Spinning Hexagon with Balls")

# Colors
BACKGROUND_COLOR = (0, 0, 0)
HEXAGON_COLOR = (255, 255, 255)
BALL_COLOR = (255, 0, 0)

# Center coordinates
CENTER = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)

# Hexagon parameters
HEX_RADIUS = 200  # Distance from center to vertices
ROTATION_SPEED = 0.15  # Radians per frame

# Ball parameters
NUM_BALLS = 10
BALL_RADIUS = 10
BALL_ORBIT_RADIUS = 150  # Distance from center for ball positions

# Initialize rotation angle
angle = 0

# Main loop
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Clear screen
    screen.fill(BACKGROUND_COLOR)

    # Update rotation angle
    angle += ROTATION_SPEED

    # Draw hexagon
    hex_points = []
    for i in range(6):
        theta = angle + i * math.pi / 3  # 60 degrees between vertices
        x = CENTER[0] + HEX_RADIUS * math.cos(theta)
        y = CENTER[1] + HEX_RADIUS * math.sin(theta)
        hex_points.append((x, y))
    pygame.draw.polygon(screen, HEXAGON_COLOR, hex_points, 2)

    # Draw balls
    for i in range(NUM_BALLS):
        ball_angle = angle + (2 * math.pi * i) / NUM_BALLS
        x = CENTER[0] + BALL_ORBIT_RADIUS * math.cos(ball_angle)
        y = CENTER[1] + BALL_ORBIT_RADIUS * math.sin(ball_angle)
        pygame.draw.circle(screen, BALL_COLOR, (int(x), int(y)), BALL_RADIUS)

    # Update display
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کلود بازده کلی بهتری داشت. شش ضلعی در حال چرخش فیزیک توپ بهتر است. Deepseek قسمت “سریع حرکت” را به درستی بدست آورد. در کل ، کلود بهتر بود.

3. انیمیشن سه بعدی با استفاده از 3JS

سریع: آیا می توانید با استفاده از 3J یک انیمیشن سه بعدی از یک شهر متروپولیتن ایجاد کنید؟

کد:


 lang="en">
    
         charset="UTF-8" />
         name="viewport" content="width=device-width, initial-scale=1.0" />
        </span>Metropolitan City - Three.js<span class="nt"/>
        <span class="nt"/>
            <span class="nt">body</span> <span class="p">{</span>
                <span class="nl">margin</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
                <span class="nl">overflow</span><span class="p">:</span> <span class="nb">hidden</span><span class="p">;</span>
                <span class="nl">background-color</span><span class="p">:</span> <span class="m">#000</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="nt">canvas</span> <span class="p">{</span>
                <span class="nl">display</span><span class="p">:</span> <span class="nb">block</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="nc">.info</span> <span class="p">{</span>
                <span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
                <span class="nl">top</span><span class="p">:</span> <span class="m">10px</span><span class="p">;</span>
                <span class="nl">left</span><span class="p">:</span> <span class="m">10px</span><span class="p">;</span>
                <span class="nl">color</span><span class="p">:</span> <span class="no">white</span><span class="p">;</span>
                <span class="nl">font-family</span><span class="p">:</span> <span class="n">Arial</span><span class="p">,</span> <span class="nb">sans-serif</span><span class="p">;</span>
                <span class="nl">background-color</span><span class="p">:</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0.5</span><span class="p">);</span>
                <span class="nl">padding</span><span class="p">:</span> <span class="m">10px</span><span class="p">;</span>
                <span class="nl">border-radius</span><span class="p">:</span> <span class="m">5px</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="nt"/>
    <span class="nt"/>
    <span class="nt"/>
        <span class="nt"><p> <span class="na">class=</span><span class="s">"info"</span><span class="nt">></span>
            Click and drag to orbit. Scroll to zoom. Use arrow keys to move
            camera.
        <span class="nt"/></p></span>
        <span class="nt"><script><![CDATA[<span class="na">src=]]></script></span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"</span><span class="nt">></span>
        <span class="nt"><script/></span>
            <span class="c1">// Main scene variables</span>
            <span class="kd">let</span> <span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span><span class="p">,</span> <span class="nx">renderer</span><span class="p">;</span>
            <span class="kd">let</span> <span class="nx">cityGroup</span><span class="p">,</span> <span class="nx">vehiclesGroup</span><span class="p">;</span>
            <span class="kd">let</span> <span class="nx">clock</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Clock</span><span class="p">();</span>
            <span class="kd">let</span> <span class="nx">cameraRotationSpeed</span> <span class="o">=</span> <span class="mf">0.003</span><span class="p">;</span>
            <span class="kd">let</span> <span class="nx">autoRotate</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>

            <span class="c1">// Setup</span>
            <span class="kd">function</span> <span class="nf">init</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Create scene</span>
                <span class="nx">scene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Scene</span><span class="p">();</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nx">background</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Color</span><span class="p">(</span><span class="mh">0x050518</span><span class="p">);</span> <span class="c1">// Night sky color</span>

                <span class="c1">// Create camera</span>
                <span class="nx">camera</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PerspectiveCamera</span><span class="p">(</span>
                    <span class="mi">60</span><span class="p">,</span>
                    <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span> <span class="o">/</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">,</span>
                    <span class="mf">0.1</span><span class="p">,</span>
                    <span class="mi">2000</span><span class="p">,</span>
                <span class="p">);</span>
                <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">150</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
                <span class="nx">camera</span><span class="p">.</span><span class="nf">lookAt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

                <span class="c1">// Create renderer</span>
                <span class="nx">renderer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">WebGLRenderer</span><span class="p">({</span> <span class="na">antialias</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span>
                <span class="nx">renderer</span><span class="p">.</span><span class="nf">setSize</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">);</span>
                <span class="nx">renderer</span><span class="p">.</span><span class="nx">shadowMap</span><span class="p">.</span><span class="nx">enabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">renderer</span><span class="p">.</span><span class="nx">shadowMap</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">PCFSoftShadowMap</span><span class="p">;</span>
                <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">renderer</span><span class="p">.</span><span class="nx">domElement</span><span class="p">);</span>

                <span class="c1">// Create groups</span>
                <span class="nx">cityGroup</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Group</span><span class="p">();</span>
                <span class="nx">vehiclesGroup</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Group</span><span class="p">();</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">cityGroup</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">vehiclesGroup</span><span class="p">);</span>

                <span class="c1">// Add lighting</span>
                <span class="nf">addLights</span><span class="p">();</span>

                <span class="c1">// Create fog for depth</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nx">fog</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">FogExp2</span><span class="p">(</span><span class="mh">0x050518</span><span class="p">,</span> <span class="mf">0.002</span><span class="p">);</span>

                <span class="c1">// Create city elements</span>
                <span class="nf">createGround</span><span class="p">();</span>
                <span class="nf">createBuildings</span><span class="p">();</span>
                <span class="nf">createStreets</span><span class="p">();</span>
                <span class="nf">createVehicles</span><span class="p">();</span>
                <span class="nf">createSkyline</span><span class="p">();</span>

                <span class="c1">// Add event listeners</span>
                <span class="nf">setupControls</span><span class="p">();</span>

                <span class="c1">// Start animation loop</span>
                <span class="nf">animate</span><span class="p">();</span>
            <span class="p">}</span>

            <span class="c1">// Lighting setup</span>
            <span class="kd">function</span> <span class="nf">addLights</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Ambient light</span>
                <span class="kd">const</span> <span class="nx">ambientLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">AmbientLight</span><span class="p">(</span><span class="mh">0x404040</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">ambientLight</span><span class="p">);</span>

                <span class="c1">// Directional light (moonlight)</span>
                <span class="kd">const</span> <span class="nx">moonLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">DirectionalLight</span><span class="p">(</span><span class="mh">0x8888ff</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">);</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">mapSize</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">mapSize</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">near</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">far</span> <span class="o">=</span> <span class="mi">500</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">left</span> <span class="o">=</span> <span class="o">-</span><span class="mi">100</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">right</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">top</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
                <span class="nx">moonLight</span><span class="p">.</span><span class="nx">shadow</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">bottom</span> <span class="o">=</span> <span class="o">-</span><span class="mi">100</span><span class="p">;</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">moonLight</span><span class="p">);</span>

                <span class="c1">// Add point lights of various colors to simulate city lights</span>
                <span class="nf">addCityLights</span><span class="p">();</span>
            <span class="p">}</span>

            <span class="c1">// Add city lights</span>
            <span class="kd">function</span> <span class="nf">addCityLights</span><span class="p">()</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">colors</span> <span class="o">=</span> <span class="p">[</span>
                    <span class="mh">0xff0000</span><span class="p">,</span> <span class="mh">0x00ff00</span><span class="p">,</span> <span class="mh">0x0000ff</span><span class="p">,</span> <span class="mh">0xffff00</span><span class="p">,</span> <span class="mh">0xff00ff</span><span class="p">,</span> <span class="mh">0x00ffff</span><span class="p">,</span>
                    <span class="mh">0xffffff</span><span class="p">,</span>
                <span class="p">];</span>

                <span class="c1">// Street lights</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">30</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">200</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">z</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">200</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">streetLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PointLight</span><span class="p">(</span><span class="mh">0xffffaa</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span>
                    <span class="nx">streetLight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                    <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">streetLight</span><span class="p">);</span>
                <span class="p">}</span>

                <span class="c1">// Building lights</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">50</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">200</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">y</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">40</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">z</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">200</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">color</span> <span class="o">=</span>
                        <span class="nx">colors</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">colors</span><span class="p">.</span><span class="nx">length</span><span class="p">)];</span>
                    <span class="kd">const</span> <span class="nx">intensity</span> <span class="o">=</span> <span class="mf">0.2</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.5</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">distance</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">20</span><span class="p">;</span>

                    <span class="kd">const</span> <span class="nx">buildingLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PointLight</span><span class="p">(</span>
                        <span class="nx">color</span><span class="p">,</span>
                        <span class="nx">intensity</span><span class="p">,</span>
                        <span class="nx">distance</span><span class="p">,</span>
                    <span class="p">);</span>
                    <span class="nx">buildingLight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                    <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">buildingLight</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create ground plane</span>
            <span class="kd">function</span> <span class="nf">createGround</span><span class="p">()</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">groundGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PlaneGeometry</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="mi">400</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">groundMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0x333333</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
                <span class="p">});</span>
                <span class="kd">const</span> <span class="nx">ground</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">groundGeometry</span><span class="p">,</span> <span class="nx">groundMaterial</span><span class="p">);</span>
                <span class="nx">ground</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                <span class="nx">ground</span><span class="p">.</span><span class="nx">receiveShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">ground</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Create buildings</span>
            <span class="kd">function</span> <span class="nf">createBuildings</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Downtown area</span>
                <span class="nf">createDowntown</span><span class="p">();</span>

                <span class="c1">// Surrounding buildings</span>
                <span class="nf">createSurroundingBuildings</span><span class="p">();</span>

                <span class="c1">// Landmark building</span>
                <span class="nf">createLandmarkBuilding</span><span class="p">();</span>
            <span class="p">}</span>

            <span class="c1">// Create downtown area with skyscrapers</span>
            <span class="kd">function</span> <span class="nf">createDowntown</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Create a grid of tall buildings</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="mi">80</span><span class="p">;</span> <span class="nx">x</span> <span class="o"><=</span> <span class="mi">80</span><span class="p">;</span> <span class="nx">x</span> <span class="o">+=</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span>
                    <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">z</span> <span class="o">=</span> <span class="o">-</span><span class="mi">80</span><span class="p">;</span> <span class="nx">z</span> <span class="o"><=</span> <span class="mi">80</span><span class="p">;</span> <span class="nx">z</span> <span class="o">+=</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span>
                        <span class="c1">// Skip some positions to create streets</span>
                        <span class="k">if </span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">abs</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="o">%</span> <span class="mi">60</span> <span class="o">===</span> <span class="mi">0</span> <span class="o">||</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">abs</span><span class="p">(</span><span class="nx">z</span><span class="p">)</span> <span class="o">%</span> <span class="mi">60</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span>
                            <span class="k">continue</span><span class="p">;</span>

                        <span class="c1">// Randomize building parameters</span>
                        <span class="kd">const</span> <span class="nx">width</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">15</span><span class="p">;</span>
                        <span class="kd">const</span> <span class="nx">height</span> <span class="o">=</span> <span class="mi">20</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">80</span><span class="p">;</span>
                        <span class="kd">const</span> <span class="nx">depth</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">15</span><span class="p">;</span>

                        <span class="c1">// Add some variation to positions</span>
                        <span class="kd">const</span> <span class="nx">xPos</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                        <span class="kd">const</span> <span class="nx">zPos</span> <span class="o">=</span> <span class="nx">z</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>

                        <span class="nf">createBuilding</span><span class="p">(</span>
                            <span class="nx">xPos</span><span class="p">,</span>
                            <span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span>
                            <span class="nx">zPos</span><span class="p">,</span>
                            <span class="nx">width</span><span class="p">,</span>
                            <span class="nx">height</span><span class="p">,</span>
                            <span class="nx">depth</span><span class="p">,</span>
                        <span class="p">);</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create surrounding lower buildings</span>
            <span class="kd">function</span> <span class="nf">createSurroundingBuildings</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Create outer areas with smaller buildings</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">80</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">angle</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">radius</span> <span class="o">=</span> <span class="mi">100</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">80</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">angle</span><span class="p">)</span> <span class="o">*</span> <span class="nx">radius</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">z</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">angle</span><span class="p">)</span> <span class="o">*</span> <span class="nx">radius</span><span class="p">;</span>

                    <span class="kd">const</span> <span class="nx">width</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">15</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">height</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">25</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">depth</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">15</span><span class="p">;</span>

                    <span class="nf">createBuilding</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">,</span> <span class="nx">depth</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create a landmark tall building at the center</span>
            <span class="kd">function</span> <span class="nf">createLandmarkBuilding</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Base</span>
                <span class="nf">createBuilding</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mh">0x888899</span><span class="p">);</span>

                <span class="c1">// Top section</span>
                <span class="nf">createBuilding</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mh">0x8888aa</span><span class="p">);</span>

                <span class="c1">// Spire</span>
                <span class="kd">const</span> <span class="nx">spireGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">ConeGeometry</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">spireMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xaaaacc</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
                <span class="p">});</span>
                <span class="kd">const</span> <span class="nx">spire</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">spireGeometry</span><span class="p">,</span> <span class="nx">spireMaterial</span><span class="p">);</span>
                <span class="nx">spire</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">130</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
                <span class="nx">spire</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">spire</span><span class="p">);</span>

                <span class="c1">// Beacon light</span>
                <span class="kd">const</span> <span class="nx">beaconLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PointLight</span><span class="p">(</span><span class="mh">0xff0000</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
                <span class="nx">beaconLight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">beaconLight</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Helper function to create a building</span>
            <span class="kd">function</span> <span class="nf">createBuilding</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">,</span> <span class="nx">depth</span><span class="p">,</span> <span class="nx">color</span><span class="p">)</span> <span class="p">{</span>
                <span class="c1">// Create building geometry</span>
                <span class="kd">const</span> <span class="nx">buildingGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">BoxGeometry</span><span class="p">(</span>
                    <span class="nx">width</span><span class="p">,</span>
                    <span class="nx">height</span><span class="p">,</span>
                    <span class="nx">depth</span><span class="p">,</span>
                <span class="p">);</span>

                <span class="c1">// Create building material with random color if not provided</span>
                <span class="kd">const</span> <span class="nx">buildingColor</span> <span class="o">=</span>
                    <span class="nx">color</span> <span class="o">||</span>
                    <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Color</span><span class="p">(</span>
                        <span class="mf">0.3</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.1</span><span class="p">,</span>
                        <span class="mf">0.3</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.1</span><span class="p">,</span>
                        <span class="mf">0.4</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.2</span><span class="p">,</span>
                    <span class="p">);</span>

                <span class="kd">const</span> <span class="nx">buildingMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="nx">buildingColor</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="c1">// Create building mesh</span>
                <span class="kd">const</span> <span class="nx">building</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                    <span class="nx">buildingGeometry</span><span class="p">,</span>
                    <span class="nx">buildingMaterial</span><span class="p">,</span>
                <span class="p">);</span>
                <span class="nx">building</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="nx">building</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">building</span><span class="p">.</span><span class="nx">receiveShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">building</span><span class="p">);</span>

                <span class="c1">// Add window lights randomly to some buildings</span>
                <span class="k">if </span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">></span> <span class="mf">0.5</span> <span class="o">&&</span> <span class="nx">height</span> <span class="o">></span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                    <span class="nf">addBuildingWindows</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">,</span> <span class="nx">depth</span><span class="p">);</span>
                <span class="p">}</span>

                <span class="k">return</span> <span class="nx">building</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="c1">// Add window lights to buildings</span>
            <span class="kd">function</span> <span class="nf">addBuildingWindows</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">,</span> <span class="nx">depth</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">windowGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PlaneGeometry</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">windowMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshBasicMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xffffcc</span><span class="p">,</span>
                    <span class="na">opacity</span><span class="p">:</span> <span class="mf">0.9</span><span class="p">,</span>
                    <span class="na">transparent</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="c1">// Calculate number of windows based on building size</span>
                <span class="kd">const</span> <span class="nx">windowsX</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">3</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">windowsY</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">4</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">windowsZ</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">depth</span> <span class="o">/</span> <span class="mi">3</span><span class="p">);</span>

                <span class="c1">// Create windows on each side of the building</span>
                <span class="kd">const</span> <span class="nx">sides</span> <span class="o">=</span> <span class="p">[</span>
                    <span class="p">{</span> <span class="na">dir</span><span class="p">:</span> <span class="dl">"</span><span class="s2">x</span><span class="dl">"</span><span class="p">,</span> <span class="na">sign</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">dir</span><span class="p">:</span> <span class="dl">"</span><span class="s2">x</span><span class="dl">"</span><span class="p">,</span> <span class="na">sign</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">dir</span><span class="p">:</span> <span class="dl">"</span><span class="s2">z</span><span class="dl">"</span><span class="p">,</span> <span class="na">sign</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">x</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">dir</span><span class="p">:</span> <span class="dl">"</span><span class="s2">z</span><span class="dl">"</span><span class="p">,</span> <span class="na">sign</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">x</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
                <span class="p">];</span>

                <span class="nx">sides</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">side</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">isX</span> <span class="o">=</span> <span class="nx">side</span><span class="p">.</span><span class="nx">dir</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">x</span><span class="dl">"</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">windowsHorizontal</span> <span class="o">=</span> <span class="nx">isX</span> <span class="p">?</span> <span class="nx">windowsZ</span> <span class="p">:</span> <span class="nx">windowsX</span><span class="p">;</span>

                    <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">wx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">wx</span> <span class="o"><</span> <span class="nx">windowsHorizontal</span><span class="p">;</span> <span class="nx">wx</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                        <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">wy</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">wy</span> <span class="o"><</span> <span class="nx">windowsY</span><span class="p">;</span> <span class="nx">wy</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                            <span class="c1">// Skip some windows to create variation</span>
                            <span class="k">if </span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">></span> <span class="mf">0.7</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>

                            <span class="kd">const</span> <span class="nb">window</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                                <span class="nx">windowGeometry</span><span class="p">,</span>
                                <span class="nx">windowMaterial</span><span class="p">.</span><span class="nf">clone</span><span class="p">(),</span>
                            <span class="p">);</span>

                            <span class="c1">// Randomize window color slightly</span>
                            <span class="k">if </span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">></span> <span class="mf">0.8</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nb">window</span><span class="p">.</span><span class="nx">material</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nf">setHex</span><span class="p">(</span>
                                    <span class="p">[</span><span class="mh">0xffffcc</span><span class="p">,</span> <span class="mh">0xffcccc</span><span class="p">,</span> <span class="mh">0xccffcc</span><span class="p">,</span> <span class="mh">0xccccff</span><span class="p">][</span>
                                        <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)</span>
                                    <span class="p">],</span>
                                <span class="p">);</span>
                            <span class="p">}</span>

                            <span class="c1">// Position window on building face</span>
                            <span class="kd">let</span> <span class="nx">wx_pos</span><span class="p">,</span> <span class="nx">wy_pos</span><span class="p">,</span> <span class="nx">wz_pos</span><span class="p">;</span>

                            <span class="k">if </span><span class="p">(</span><span class="nx">isX</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nx">wx_pos</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">side</span><span class="p">.</span><span class="nx">sign</span> <span class="o">*</span> <span class="p">(</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mf">0.01</span><span class="p">);</span>
                                <span class="nx">wy_pos</span> <span class="o">=</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">wy</span> <span class="o">*</span> <span class="mi">4</span><span class="p">;</span>
                                <span class="nx">wz_pos</span> <span class="o">=</span> <span class="nx">z</span> <span class="o">-</span> <span class="nx">depth</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mf">1.5</span> <span class="o">+</span> <span class="nx">wx</span> <span class="o">*</span> <span class="mi">3</span><span class="p">;</span>
                                <span class="nb">window</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                                <span class="nx">wx_pos</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">-</span> <span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mf">1.5</span> <span class="o">+</span> <span class="nx">wx</span> <span class="o">*</span> <span class="mi">3</span><span class="p">;</span>
                                <span class="nx">wy_pos</span> <span class="o">=</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">wy</span> <span class="o">*</span> <span class="mi">4</span><span class="p">;</span>
                                <span class="nx">wz_pos</span> <span class="o">=</span> <span class="nx">z</span> <span class="o">+</span> <span class="nx">side</span><span class="p">.</span><span class="nx">sign</span> <span class="o">*</span> <span class="p">(</span><span class="nx">depth</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="mf">0.01</span><span class="p">);</span>
                            <span class="p">}</span>

                            <span class="nb">window</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">wx_pos</span><span class="p">,</span> <span class="nx">wy_pos</span><span class="p">,</span> <span class="nx">wz_pos</span><span class="p">);</span>
                            <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nb">window</span><span class="p">);</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">});</span>
            <span class="p">}</span>

            <span class="c1">// Create streets</span>
            <span class="kd">function</span> <span class="nf">createStreets</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Main streets</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><=</span> <span class="mi">2</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="c1">// X-axis streets</span>
                    <span class="nf">createStreet</span><span class="p">(</span><span class="nx">i</span> <span class="o">*</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">400</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

                    <span class="c1">// Z-axis streets</span>
                    <span class="nf">createStreet</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">400</span><span class="p">);</span>
                <span class="p">}</span>

                <span class="c1">// Street lamps</span>
                <span class="nf">createStreetLamps</span><span class="p">();</span>
            <span class="p">}</span>

            <span class="c1">// Create a street</span>
            <span class="kd">function</span> <span class="nf">createStreet</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">depth</span><span class="p">,</span> <span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">streetGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">BoxGeometry</span><span class="p">(</span>
                    <span class="nx">width</span><span class="p">,</span>
                    <span class="mf">0.1</span><span class="p">,</span>
                    <span class="nx">height</span><span class="p">,</span>
                <span class="p">);</span>
                <span class="kd">const</span> <span class="nx">streetMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0x333333</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.9</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">street</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">streetGeometry</span><span class="p">,</span> <span class="nx">streetMaterial</span><span class="p">);</span>
                <span class="nx">street</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="nx">street</span><span class="p">.</span><span class="nx">receiveShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">street</span><span class="p">);</span>

                <span class="c1">// Add road markings</span>
                <span class="nf">addRoadMarkings</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Add road markings</span>
            <span class="kd">function</span> <span class="nf">addRoadMarkings</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
                <span class="c1">// Determine if this is an X or Z oriented street</span>
                <span class="kd">const</span> <span class="nx">isXStreet</span> <span class="o">=</span> <span class="nx">height</span> <span class="o">></span> <span class="nx">width</span><span class="p">;</span>

                <span class="c1">// Set dimensions based on orientation</span>
                <span class="kd">const</span> <span class="nx">markingLength</span> <span class="o">=</span> <span class="nx">isXStreet</span> <span class="p">?</span> <span class="mi">5</span> <span class="p">:</span> <span class="nx">width</span> <span class="o">*</span> <span class="mf">0.8</span><span class="p">;</span>
                <span class="kd">const</span> <span class="nx">markingWidth</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>

                <span class="c1">// Create geometry based on orientation</span>
                <span class="kd">const</span> <span class="nx">markingGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PlaneGeometry</span><span class="p">(</span>
                    <span class="nx">isXStreet</span> <span class="p">?</span> <span class="nx">markingWidth</span> <span class="p">:</span> <span class="nx">markingLength</span><span class="p">,</span>
                    <span class="nx">isXStreet</span> <span class="p">?</span> <span class="nx">markingLength</span> <span class="p">:</span> <span class="nx">markingWidth</span><span class="p">,</span>
                <span class="p">);</span>

                <span class="kd">const</span> <span class="nx">markingMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshBasicMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xffffff</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="c1">// For X-oriented streets (running along Z axis)</span>
                <span class="k">if </span><span class="p">(</span><span class="nx">isXStreet</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">numMarkings</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">15</span><span class="p">);</span> <span class="c1">// One marking every 15 units</span>
                    <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">numMarkings</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                        <span class="kd">const</span> <span class="nx">marking</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                            <span class="nx">markingGeometry</span><span class="p">,</span>
                            <span class="nx">markingMaterial</span><span class="p">,</span>
                        <span class="p">);</span>
                        <span class="nx">marking</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// Rotate to lay flat</span>
                        <span class="kd">const</span> <span class="nx">zPos</span> <span class="o">=</span> <span class="nx">z</span> <span class="o">-</span> <span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">15</span> <span class="o">+</span> <span class="mf">7.5</span><span class="p">;</span> <span class="c1">// Distribute evenly</span>
                        <span class="nx">marking</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="nx">zPos</span><span class="p">);</span>
                        <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">marking</span><span class="p">);</span>
                    <span class="p">}</span>
                <span class="p">}</span>
                <span class="c1">// For Z-oriented streets (running along X axis)</span>
                <span class="k">else</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">numMarkings</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">15</span><span class="p">);</span>
                    <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">numMarkings</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                        <span class="kd">const</span> <span class="nx">marking</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                            <span class="nx">markingGeometry</span><span class="p">,</span>
                            <span class="nx">markingMaterial</span><span class="p">,</span>
                        <span class="p">);</span>
                        <span class="nx">marking</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// Rotate to lay flat</span>
                        <span class="kd">const</span> <span class="nx">xPos</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">-</span> <span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">15</span> <span class="o">+</span> <span class="mf">7.5</span><span class="p">;</span> <span class="c1">// Distribute evenly</span>
                        <span class="nx">marking</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">xPos</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                        <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">marking</span><span class="p">);</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create street lamps</span>
            <span class="kd">function</span> <span class="nf">createStreetLamps</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Place street lamps along the streets</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><=</span> <span class="mi">2</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">j</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span><span class="p">;</span> <span class="nx">j</span> <span class="o"><=</span> <span class="mi">6</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                        <span class="k">if </span><span class="p">(</span><span class="nx">j</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                            <span class="c1">// X-axis streets</span>
                            <span class="nf">createStreetLamp</span><span class="p">(</span><span class="nx">j</span> <span class="o">*</span> <span class="mi">30</span><span class="p">,</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">60</span><span class="p">);</span>

                            <span class="c1">// Z-axis streets</span>
                            <span class="nf">createStreetLamp</span><span class="p">(</span><span class="nx">i</span> <span class="o">*</span> <span class="mi">60</span><span class="p">,</span> <span class="nx">j</span> <span class="o">*</span> <span class="mi">30</span><span class="p">);</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create a street lamp</span>
            <span class="kd">function</span> <span class="nf">createStreetLamp</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">z</span><span class="p">)</span> <span class="p">{</span>
                <span class="c1">// Pole</span>
                <span class="kd">const</span> <span class="nx">poleGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">CylinderGeometry</span><span class="p">(</span><span class="mf">0.3</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">poleMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0x888888</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.3</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">pole</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">poleGeometry</span><span class="p">,</span> <span class="nx">poleMaterial</span><span class="p">);</span>
                <span class="nx">pole</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="nx">pole</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">pole</span><span class="p">);</span>

                <span class="c1">// Lamp head</span>
                <span class="kd">const</span> <span class="nx">headGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">SphereGeometry</span><span class="p">(</span>
                    <span class="mf">0.8</span><span class="p">,</span>
                    <span class="mi">16</span><span class="p">,</span>
                    <span class="mi">8</span><span class="p">,</span>
                    <span class="mi">0</span><span class="p">,</span>
                    <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span>
                    <span class="mi">0</span><span class="p">,</span>
                    <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span>
                <span class="p">);</span>
                <span class="kd">const</span> <span class="nx">headMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xaaaaaa</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">head</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">headGeometry</span><span class="p">,</span> <span class="nx">headMaterial</span><span class="p">);</span>
                <span class="nx">head</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="nx">head</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">;</span>
                <span class="nx">head</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">cityGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">head</span><span class="p">);</span>

                <span class="c1">// Light</span>
                <span class="kd">const</span> <span class="nx">light</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PointLight</span><span class="p">(</span><span class="mh">0xffffcc</span><span class="p">,</span> <span class="mf">0.6</span><span class="p">,</span> <span class="mi">15</span><span class="p">);</span>
                <span class="nx">light</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mf">7.8</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">light</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Create vehicles that move along streets</span>
            <span class="kd">function</span> <span class="nf">createVehicles</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Create 20 vehicles</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">20</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="c1">// Determine street position and orientation</span>
                    <span class="kd">const</span> <span class="nx">onXStreet</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">></span> <span class="mf">0.5</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">streetIndex</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">5</span><span class="p">)</span> <span class="o">-</span> <span class="mi">2</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">streetPos</span> <span class="o">=</span> <span class="nx">streetIndex</span> <span class="o">*</span> <span class="mi">60</span><span class="p">;</span>

                    <span class="c1">// Initial position on street</span>
                    <span class="kd">const</span> <span class="nx">alongStreet</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">180</span><span class="p">;</span>

                    <span class="kd">let</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">direction</span><span class="p">;</span>
                    <span class="k">if </span><span class="p">(</span><span class="nx">onXStreet</span><span class="p">)</span> <span class="p">{</span>
                        <span class="nx">x</span> <span class="o">=</span> <span class="nx">alongStreet</span><span class="p">;</span>
                        <span class="nx">z</span> <span class="o">=</span> <span class="nx">streetPos</span><span class="p">;</span>
                        <span class="nx">direction</span> <span class="o">=</span> <span class="nx">alongStreet</span> <span class="o">></span> <span class="mi">0</span> <span class="p">?</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="p">:</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// Direction based on position</span>
                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                        <span class="nx">x</span> <span class="o">=</span> <span class="nx">streetPos</span><span class="p">;</span>
                        <span class="nx">z</span> <span class="o">=</span> <span class="nx">alongStreet</span><span class="p">;</span>
                        <span class="nx">direction</span> <span class="o">=</span>
                            <span class="nx">alongStreet</span> <span class="o">></span> <span class="mi">0</span> <span class="p">?</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span> <span class="p">:</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                    <span class="p">}</span>

                    <span class="c1">// Create the vehicle</span>
                    <span class="nf">createVehicle</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">direction</span><span class="p">,</span> <span class="nx">onXStreet</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create a single vehicle</span>
            <span class="kd">function</span> <span class="nf">createVehicle</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">z</span><span class="p">,</span> <span class="nx">direction</span><span class="p">,</span> <span class="nx">onXStreet</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">vehicleGroup</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Group</span><span class="p">();</span>

                <span class="c1">// Car body</span>
                <span class="kd">const</span> <span class="nx">bodyGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">BoxGeometry</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mf">1.5</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>

                <span class="c1">// Random car color</span>
                <span class="kd">const</span> <span class="nx">colors</span> <span class="o">=</span> <span class="p">[</span>
                    <span class="mh">0xff0000</span><span class="p">,</span> <span class="mh">0x00ff00</span><span class="p">,</span> <span class="mh">0x0000ff</span><span class="p">,</span> <span class="mh">0xffff00</span><span class="p">,</span> <span class="mh">0xff00ff</span><span class="p">,</span> <span class="mh">0x00ffff</span><span class="p">,</span>
                    <span class="mh">0xffffff</span><span class="p">,</span> <span class="mh">0x000000</span><span class="p">,</span>
                <span class="p">];</span>
                <span class="kd">const</span> <span class="nx">bodyColor</span> <span class="o">=</span>
                    <span class="nx">colors</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">colors</span><span class="p">.</span><span class="nx">length</span><span class="p">)];</span>

                <span class="kd">const</span> <span class="nx">bodyMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="nx">bodyColor</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">body</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">bodyGeometry</span><span class="p">,</span> <span class="nx">bodyMaterial</span><span class="p">);</span>
                <span class="nx">body</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="nx">body</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">body</span><span class="p">);</span>

                <span class="c1">// Car roof</span>
                <span class="kd">const</span> <span class="nx">roofGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">BoxGeometry</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">1.8</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">roofMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="nx">bodyColor</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">roof</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">roofGeometry</span><span class="p">,</span> <span class="nx">roofMaterial</span><span class="p">);</span>
                <span class="nx">roof</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="mf">2.25</span><span class="p">;</span>
                <span class="nx">roof</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">;</span>
                <span class="nx">roof</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">roof</span><span class="p">);</span>

                <span class="c1">// Wheels</span>
                <span class="kd">const</span> <span class="nx">wheelPositions</span> <span class="o">=</span> <span class="p">[</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="o">-</span><span class="mf">1.2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mf">0.6</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="mi">1</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="o">-</span><span class="mf">1.2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mf">0.6</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="mf">1.2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mf">0.6</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="mi">1</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="mf">1.2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mf">0.6</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span> <span class="p">},</span>
                <span class="p">];</span>

                <span class="kd">const</span> <span class="nx">wheelGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">CylinderGeometry</span><span class="p">(</span>
                    <span class="mf">0.5</span><span class="p">,</span>
                    <span class="mf">0.5</span><span class="p">,</span>
                    <span class="mf">0.4</span><span class="p">,</span>
                    <span class="mi">12</span><span class="p">,</span>
                <span class="p">);</span>
                <span class="kd">const</span> <span class="nx">wheelMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshStandardMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0x111111</span><span class="p">,</span>
                    <span class="na">roughness</span><span class="p">:</span> <span class="mf">0.9</span><span class="p">,</span>
                    <span class="na">metalness</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="nx">wheelPositions</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">pos</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">wheel</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">wheelGeometry</span><span class="p">,</span> <span class="nx">wheelMaterial</span><span class="p">);</span>
                    <span class="nx">wheel</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
                    <span class="nx">wheel</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                    <span class="nx">wheel</span><span class="p">.</span><span class="nx">castShadow</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                    <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">wheel</span><span class="p">);</span>
                <span class="p">});</span>

                <span class="c1">// Headlights</span>
                <span class="kd">const</span> <span class="nx">headlightGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">SphereGeometry</span><span class="p">(</span><span class="mf">0.2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">headlightMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshBasicMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xffffff</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">headlightPositions</span> <span class="o">=</span> <span class="p">[</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="mf">0.7</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="o">-</span><span class="mf">0.7</span> <span class="p">},</span>
                <span class="p">];</span>

                <span class="nx">headlightPositions</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">pos</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">headlight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                        <span class="nx">headlightGeometry</span><span class="p">,</span>
                        <span class="nx">headlightMaterial</span><span class="p">,</span>
                    <span class="p">);</span>
                    <span class="nx">headlight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
                    <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">headlight</span><span class="p">);</span>

                    <span class="c1">// Add headlight beam</span>
                    <span class="kd">const</span> <span class="nx">headlightBeam</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">SpotLight</span><span class="p">(</span>
                        <span class="mh">0xffffee</span><span class="p">,</span>
                        <span class="mf">0.3</span><span class="p">,</span>
                        <span class="mi">20</span><span class="p">,</span>
                        <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">6</span><span class="p">,</span>
                        <span class="mf">0.5</span><span class="p">,</span>
                    <span class="p">);</span>
                    <span class="nx">headlightBeam</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
                    <span class="nx">headlightBeam</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
                    <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">headlightBeam</span><span class="p">);</span>
                    <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">headlightBeam</span><span class="p">.</span><span class="nx">target</span><span class="p">);</span>
                <span class="p">});</span>

                <span class="c1">// Taillights (red)</span>
                <span class="kd">const</span> <span class="nx">taillightGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">SphereGeometry</span><span class="p">(</span><span class="mf">0.2</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">taillightMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshBasicMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xff0000</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">taillightPositions</span> <span class="o">=</span> <span class="p">[</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="mf">0.7</span> <span class="p">},</span>
                    <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">z</span><span class="p">:</span> <span class="o">-</span><span class="mf">0.7</span> <span class="p">},</span>
                <span class="p">];</span>

                <span class="nx">taillightPositions</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">pos</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">taillight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                        <span class="nx">taillightGeometry</span><span class="p">,</span>
                        <span class="nx">taillightMaterial</span><span class="p">,</span>
                    <span class="p">);</span>
                    <span class="nx">taillight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">pos</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">pos</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
                    <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">taillight</span><span class="p">);</span>
                <span class="p">});</span>

                <span class="c1">// Set vehicle position and rotation</span>
                <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">;</span>

                <span class="c1">// Add to vehicles group</span>
                <span class="nx">vehiclesGroup</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">vehicleGroup</span><span class="p">);</span>

                <span class="c1">// Add metadata for movement</span>
                <span class="nx">vehicleGroup</span><span class="p">.</span><span class="nx">userData</span> <span class="o">=</span> <span class="p">{</span>
                    <span class="na">speed</span><span class="p">:</span> <span class="mf">0.2</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.4</span><span class="p">,</span>
                    <span class="na">onXStreet</span><span class="p">:</span> <span class="nx">onXStreet</span><span class="p">,</span>
                <span class="p">};</span>
            <span class="p">}</span>

            <span class="c1">// Create skyline elements</span>
            <span class="kd">function</span> <span class="nf">createSkyline</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Create stars in the night sky</span>
                <span class="nf">createStars</span><span class="p">();</span>

                <span class="c1">// Create moon</span>
                <span class="nf">createMoon</span><span class="p">();</span>
            <span class="p">}</span>

            <span class="c1">// Create stars</span>
            <span class="kd">function</span> <span class="nf">createStars</span><span class="p">()</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">starsGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">BufferGeometry</span><span class="p">();</span>
                <span class="kd">const</span> <span class="nx">starsMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PointsMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xffffff</span><span class="p">,</span>
                    <span class="na">size</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span>
                    <span class="na">transparent</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
                    <span class="na">opacity</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
                <span class="p">});</span>

                <span class="kd">const</span> <span class="nx">starsVertices</span> <span class="o">=</span> <span class="p">[];</span>
                <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">1000</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2000</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">y</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">z</span> <span class="o">=</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2000</span><span class="p">;</span>
                    <span class="nx">starsVertices</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                <span class="p">}</span>

                <span class="nx">starsGeometry</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span>
                    <span class="dl">"</span><span class="s2">position</span><span class="dl">"</span><span class="p">,</span>
                    <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Float32BufferAttribute</span><span class="p">(</span><span class="nx">starsVertices</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
                <span class="p">);</span>
                <span class="kd">const</span> <span class="nx">stars</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Points</span><span class="p">(</span><span class="nx">starsGeometry</span><span class="p">,</span> <span class="nx">starsMaterial</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">stars</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Create moon</span>
            <span class="kd">function</span> <span class="nf">createMoon</span><span class="p">()</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">moonGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">SphereGeometry</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">32</span><span class="p">);</span>
                <span class="kd">const</span> <span class="nx">moonMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshBasicMaterial</span><span class="p">({</span>
                    <span class="na">color</span><span class="p">:</span> <span class="mh">0xffffee</span><span class="p">,</span>
                <span class="p">});</span>
                <span class="kd">const</span> <span class="nx">moon</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">moonGeometry</span><span class="p">,</span> <span class="nx">moonMaterial</span><span class="p">);</span>
                <span class="nx">moon</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="o">-</span><span class="mi">400</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">moon</span><span class="p">);</span>

                <span class="c1">// Add glow</span>
                <span class="kd">const</span> <span class="nx">moonGlow</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PointLight</span><span class="p">(</span><span class="mh">0xffffee</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
                <span class="nx">moonGlow</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">copy</span><span class="p">(</span><span class="nx">moon</span><span class="p">.</span><span class="nx">position</span><span class="p">);</span>
                <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">moonGlow</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Setup controls</span>
            <span class="kd">function</span> <span class="nf">setupControls</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// Mouse controls for camera rotation</span>
                <span class="kd">let</span> <span class="nx">isDragging</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
                <span class="kd">let</span> <span class="nx">previousMousePosition</span> <span class="o">=</span> <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
                <span class="kd">let</span> <span class="nx">rotationSpeed</span> <span class="o">=</span> <span class="mf">0.003</span><span class="p">;</span>

                <span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mousedown</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="nx">isDragging</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
                    <span class="nx">previousMousePosition</span> <span class="o">=</span> <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">clientX</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">clientY</span> <span class="p">};</span>
                    <span class="nx">autoRotate</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
                <span class="p">});</span>

                <span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mousemove</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="k">if </span><span class="p">(</span><span class="nx">isDragging</span><span class="p">)</span> <span class="p">{</span>
                        <span class="kd">const</span> <span class="nx">deltaMove</span> <span class="o">=</span> <span class="p">{</span>
                            <span class="na">x</span><span class="p">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">clientX</span> <span class="o">-</span> <span class="nx">previousMousePosition</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span>
                            <span class="na">y</span><span class="p">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">clientY</span> <span class="o">-</span> <span class="nx">previousMousePosition</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span>
                        <span class="p">};</span>

                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span>
                            <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">deltaMove</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">rotationSpeed</span><span class="p">)</span> <span class="o">*</span>
                                <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span>
                            <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">deltaMove</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">rotationSpeed</span><span class="p">)</span> <span class="o">*</span>
                                <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span>
                            <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">deltaMove</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">rotationSpeed</span><span class="p">)</span> <span class="o">*</span>
                                <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span>
                            <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">deltaMove</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">rotationSpeed</span><span class="p">)</span> <span class="o">*</span>
                                <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">;</span>

                        <span class="kd">const</span> <span class="nx">rotationMatrix</span> <span class="o">=</span>
                            <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Matrix4</span><span class="p">().</span><span class="nf">makeRotationAxis</span><span class="p">(</span>
                                <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Vector3</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
                                <span class="nx">deltaMove</span><span class="p">.</span><span class="nx">y</span> <span class="o">*</span> <span class="nx">rotationSpeed</span><span class="p">,</span>
                            <span class="p">);</span>

                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">applyMatrix4</span><span class="p">(</span><span class="nx">rotationMatrix</span><span class="p">);</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nf">lookAt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

                        <span class="nx">previousMousePosition</span> <span class="o">=</span> <span class="p">{</span> <span class="na">x</span><span class="p">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">clientX</span><span class="p">,</span> <span class="na">y</span><span class="p">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">clientY</span> <span class="p">};</span>
                    <span class="p">}</span>
                <span class="p">});</span>

                <span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseup</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="nx">isDragging</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
                <span class="p">});</span>

                <span class="c1">// Scroll to zoom</span>
                <span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">wheel</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">zoomSpeed</span> <span class="o">=</span> <span class="mf">0.1</span><span class="p">;</span>
                    <span class="kd">const</span> <span class="nx">distance</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">,</span>
                    <span class="p">);</span>

                    <span class="kd">const</span> <span class="nx">direction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Vector3</span><span class="p">(</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">/</span> <span class="nx">distance</span><span class="p">,</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">/</span> <span class="nx">distance</span><span class="p">,</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">/</span> <span class="nx">distance</span><span class="p">,</span>
                    <span class="p">);</span>

                    <span class="k">if </span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">deltaY</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                        <span class="c1">// Zoom out</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">zoomSpeed</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">+=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">y</span> <span class="o">*</span> <span class="nx">zoomSpeed</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">+=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="nx">zoomSpeed</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                        <span class="c1">// Zoom in</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">-=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">zoomSpeed</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">-=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">y</span> <span class="o">*</span> <span class="nx">zoomSpeed</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">-=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="nx">zoomSpeed</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span>
                    <span class="p">}</span>

                    <span class="c1">// Limit minimum and maximum zoom</span>
                    <span class="kd">const</span> <span class="nx">newDistance</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">,</span>
                    <span class="p">);</span>

                    <span class="k">if</span> <span class="p">(</span><span class="nx">newDistance</span> <span class="o"><</span> <span class="mi">50</span><span class="p">)</span> <span class="p">{</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="mi">50</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">y</span> <span class="o">*</span> <span class="mi">50</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="mi">50</span><span class="p">;</span>
                    <span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">newDistance</span> <span class="o">></span> <span class="mi">400</span><span class="p">)</span> <span class="p">{</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="mi">400</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">y</span> <span class="o">*</span> <span class="mi">400</span><span class="p">;</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nx">direction</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="mi">400</span><span class="p">;</span>
                    <span class="p">}</span>

                    <span class="nx">camera</span><span class="p">.</span><span class="nf">lookAt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
                <span class="p">});</span>

                <span class="c1">// Keyboard controls for camera movement</span>
                <span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keydown</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">moveSpeed</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
                    <span class="nx">autoRotate</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>

                    <span class="k">switch </span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
                        <span class="k">case</span> <span class="dl">"</span><span class="s2">ArrowUp</span><span class="dl">"</span><span class="p">:</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">+=</span> <span class="nx">moveSpeed</span><span class="p">;</span>
                            <span class="k">break</span><span class="p">;</span>
                        <span class="k">case</span> <span class="dl">"</span><span class="s2">ArrowDown</span><span class="dl">"</span><span class="p">:</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">-=</span> <span class="nx">moveSpeed</span><span class="p">;</span>
                            <span class="k">break</span><span class="p">;</span>
                        <span class="k">case</span> <span class="dl">"</span><span class="s2">ArrowLeft</span><span class="dl">"</span><span class="p">:</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">-=</span> <span class="nx">moveSpeed</span><span class="p">;</span>
                            <span class="k">break</span><span class="p">;</span>
                        <span class="k">case</span> <span class="dl">"</span><span class="s2">ArrowRight</span><span class="dl">"</span><span class="p">:</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="nx">moveSpeed</span><span class="p">;</span>
                            <span class="k">break</span><span class="p">;</span>
                    <span class="p">}</span>

                    <span class="nx">camera</span><span class="p">.</span><span class="nf">lookAt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
                <span class="p">});</span>

                <span class="c1">// Handle window resize</span>
                <span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">resize</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="nx">camera</span><span class="p">.</span><span class="nx">aspect</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span> <span class="o">/</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">;</span>
                    <span class="nx">camera</span><span class="p">.</span><span class="nf">updateProjectionMatrix</span><span class="p">();</span>
                    <span class="nx">renderer</span><span class="p">.</span><span class="nf">setSize</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">);</span>
                <span class="p">});</span>
            <span class="p">}</span>

            <span class="c1">// Update vehicles</span>
            <span class="kd">function</span> <span class="nf">updateVehicles</span><span class="p">(</span><span class="nx">deltaTime</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">vehiclesGroup</span><span class="p">.</span><span class="nx">children</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">vehicle</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="p">{</span> <span class="nx">speed</span><span class="p">,</span> <span class="nx">onXStreet</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">vehicle</span><span class="p">.</span><span class="nx">userData</span><span class="p">;</span>

                    <span class="c1">// Move vehicle based on its direction</span>
                    <span class="k">if </span><span class="p">(</span><span class="nx">onXStreet</span><span class="p">)</span> <span class="p">{</span>
                        <span class="c1">// Vehicle is traveling along X axis</span>
                        <span class="k">if </span><span class="p">(</span><span class="nx">vehicle</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                            <span class="c1">// Moving in positive X direction</span>
                            <span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="nx">speed</span> <span class="o">*</span> <span class="nx">deltaTime</span><span class="p">;</span>

                            <span class="c1">// If reached edge of map, turn around</span>
                            <span class="k">if </span><span class="p">(</span><span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">></span> <span class="mi">190</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nx">vehicle</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">;</span>
                            <span class="p">}</span>
                        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                            <span class="c1">// Moving in negative X direction</span>
                            <span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">-=</span> <span class="nx">speed</span> <span class="o">*</span> <span class="nx">deltaTime</span><span class="p">;</span>

                            <span class="c1">// If reached edge of map, turn around</span>
                            <span class="k">if</span> <span class="p">(</span><span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o"><</span> <span class="o">-</span><span class="mi">190</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nx">vehicle</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                        <span class="c1">// Vehicle is traveling along Z axis</span>
                        <span class="k">if </span><span class="p">(</span><span class="nx">vehicle</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">===</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
                            <span class="c1">// Moving in positive Z direction</span>
                            <span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">+=</span> <span class="nx">speed</span> <span class="o">*</span> <span class="nx">deltaTime</span><span class="p">;</span>

                            <span class="c1">// If reached edge of map, turn around</span>
                            <span class="k">if </span><span class="p">(</span><span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">></span> <span class="mi">190</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nx">vehicle</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                            <span class="p">}</span>
                        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                            <span class="c1">// Moving in negative Z direction</span>
                            <span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">-=</span> <span class="nx">speed</span> <span class="o">*</span> <span class="nx">deltaTime</span><span class="p">;</span>

                            <span class="c1">// If reached edge of map, turn around</span>
                            <span class="k">if</span> <span class="p">(</span><span class="nx">vehicle</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o"><</span> <span class="o">-</span><span class="mi">190</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nx">vehicle</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span>

                    <span class="c1">// Animate wheels (optional)</span>
                    <span class="nx">vehicle</span><span class="p">.</span><span class="nx">children</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">child</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
                        <span class="k">if </span><span class="p">(</span>
                            <span class="nx">child</span><span class="p">.</span><span class="nx">geometry</span> <span class="o">&&</span>
                            <span class="nx">child</span><span class="p">.</span><span class="nx">geometry</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">CylinderGeometry</span><span class="dl">"</span> <span class="o">&&</span>
                            <span class="nx">child</span><span class="p">.</span><span class="nx">geometry</span><span class="p">.</span><span class="nx">parameters</span><span class="p">.</span><span class="nx">radiusTop</span> <span class="o">===</span> <span class="mf">0.5</span>
                        <span class="p">)</span> <span class="p">{</span>
                            <span class="nx">child</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="nx">speed</span> <span class="o">*</span> <span class="mf">0.1</span><span class="p">;</span>
                        <span class="p">}</span>
                    <span class="p">});</span>
                <span class="p">});</span>
            <span class="p">}</span>

            <span class="c1">// Animation loop</span>
            <span class="kd">function</span> <span class="nf">animate</span><span class="p">()</span> <span class="p">{</span>
                <span class="nf">requestAnimationFrame</span><span class="p">(</span><span class="nx">animate</span><span class="p">);</span>

                <span class="c1">// Get delta time for smooth animation regardless of frame rate</span>
                <span class="kd">const</span> <span class="nx">deltaTime</span> <span class="o">=</span> <span class="nx">clock</span><span class="p">.</span><span class="nf">getDelta</span><span class="p">();</span>

                <span class="c1">// Update vehicles</span>
                <span class="nf">updateVehicles</span><span class="p">(</span><span class="nx">deltaTime</span><span class="p">);</span>

                <span class="c1">// Auto rotate camera if enabled</span>
                <span class="k">if </span><span class="p">(</span><span class="nx">autoRotate</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">radius</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span>
                        <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span>
                            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">,</span>
                    <span class="p">);</span>

                    <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span>
                        <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">cameraRotationSpeed</span><span class="p">)</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span>
                        <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">cameraRotationSpeed</span><span class="p">)</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">;</span>
                    <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span>
                        <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">cameraRotationSpeed</span><span class="p">)</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span>
                        <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">cameraRotationSpeed</span><span class="p">)</span> <span class="o">*</span> <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span><span class="p">;</span>

                    <span class="nx">camera</span><span class="p">.</span><span class="nf">lookAt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
                <span class="p">}</span>

                <span class="c1">// Render scene</span>
                <span class="nx">renderer</span><span class="p">.</span><span class="nf">render</span><span class="p">(</span><span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="c1">// Start the application</span>
            <span class="nf">init</span><span class="p">();</span>
        <span class="nt"/>
    <span class="nt"/>
<span class="nt"/>
</span></span></span></code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>حالت تمام صفحه را وارد کنید
    

از حالت تمام صفحه خارج شوید

خروجی Deepseek R1




    </span>3D Metropolitan City<span class="nt"/>
    <span class="nt"/>
        <span class="nt">body</span> <span class="p">{</span> <span class="nl">margin</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
        <span class="nt">canvas</span> <span class="p">{</span> <span class="nl">display</span><span class="p">:</span> <span class="nb">block</span><span class="p">;</span> <span class="p">}</span>
    <span class="nt"/>
<span class="nt"/>
<span class="nt"/>
    <span class="nt"><script><![CDATA[<span class="na">src=]]></script></span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"</span><span class="nt">></span>
    <span class="nt"><script/></span>
        <span class="kd">let</span> <span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span><span class="p">,</span> <span class="nx">renderer</span><span class="p">,</span> <span class="nx">city</span><span class="p">;</span>
        <span class="kd">let</span> <span class="nx">dayCycle</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
        <span class="kd">let</span> <span class="nx">lights</span> <span class="o">=</span> <span class="p">[];</span>

        <span class="kd">function</span> <span class="nf">init</span><span class="p">()</span> <span class="p">{</span>
            <span class="c1">// Create scene</span>
            <span class="nx">scene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Scene</span><span class="p">();</span>

            <span class="c1">// Create camera</span>
            <span class="nx">camera</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PerspectiveCamera</span><span class="p">(</span><span class="mi">75</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span> <span class="o">/</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>

            <span class="c1">// Create renderer</span>
            <span class="nx">renderer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">WebGLRenderer</span><span class="p">({</span> <span class="na">antialias</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span>
            <span class="nx">renderer</span><span class="p">.</span><span class="nf">setSize</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">);</span>
            <span class="nx">renderer</span><span class="p">.</span><span class="nf">setClearColor</span><span class="p">(</span><span class="mh">0x87CEEB</span><span class="p">);</span>
            <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">renderer</span><span class="p">.</span><span class="nx">domElement</span><span class="p">);</span>

            <span class="c1">// Create city</span>
            <span class="nf">createCity</span><span class="p">();</span>

            <span class="c1">// Add lights</span>
            <span class="kd">const</span> <span class="nx">ambientLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">AmbientLight</span><span class="p">(</span><span class="mh">0x404040</span><span class="p">);</span>
            <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">ambientLight</span><span class="p">);</span>

            <span class="kd">const</span> <span class="nx">directionalLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">DirectionalLight</span><span class="p">(</span><span class="mh">0xffffff</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">);</span>
            <span class="nx">directionalLight</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
            <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">directionalLight</span><span class="p">);</span>

            <span class="c1">// Add event listeners</span>
            <span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">resize</span><span class="dl">'</span><span class="p">,</span> <span class="nx">onWindowResize</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
            <span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="nx">toggleDayCycle</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="kd">function</span> <span class="nf">createCity</span><span class="p">()</span> <span class="p">{</span>
            <span class="nx">city</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Group</span><span class="p">();</span>

            <span class="c1">// Create buildings</span>
            <span class="kd">const</span> <span class="nx">buildingGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">BoxGeometry</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>

            <span class="k">for</span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="mi">50</span><span class="p">;</span> <span class="nx">x</span> <span class="o"><</span> <span class="mi">50</span><span class="p">;</span> <span class="nx">x</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">for</span><span class="p">(</span><span class="kd">let</span> <span class="nx">z</span> <span class="o">=</span> <span class="o">-</span><span class="mi">50</span><span class="p">;</span> <span class="nx">z</span> <span class="o"><</span> <span class="mi">50</span><span class="p">;</span> <span class="nx">z</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                    <span class="k">if</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">></span> <span class="mf">0.3</span><span class="p">)</span> <span class="p">{</span>
                        <span class="kd">const</span> <span class="nx">height</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">30</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
                        <span class="kd">const</span> <span class="nx">building</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span>
                            <span class="nx">buildingGeometry</span><span class="p">,</span>
                            <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshPhongMaterial</span><span class="p">({</span> 
                                <span class="na">color</span><span class="p">:</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Color</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">(),</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">(),</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()),</span>
                                <span class="na">transparent</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
                                <span class="na">opacity</span><span class="p">:</span> <span class="mf">0.8</span>
                            <span class="p">})</span>
                        <span class="p">);</span>
                        <span class="nx">building</span><span class="p">.</span><span class="nx">scale</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">height</span><span class="p">;</span>
                        <span class="nx">building</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">height</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>
                        <span class="nx">city</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">building</span><span class="p">);</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="c1">// Create roads</span>
            <span class="kd">const</span> <span class="nx">roadGeometry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PlaneGeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
            <span class="kd">const</span> <span class="nx">roadMaterial</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">MeshPhongMaterial</span><span class="p">({</span> <span class="na">color</span><span class="p">:</span> <span class="mh">0x444444</span> <span class="p">});</span>

            <span class="k">for</span><span class="p">(</span><span class="kd">let</span> <span class="nx">z</span> <span class="o">=</span> <span class="o">-</span><span class="mi">45</span><span class="p">;</span> <span class="nx">z</span> <span class="o"><=</span> <span class="mi">45</span><span class="p">;</span> <span class="nx">z</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">road</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Mesh</span><span class="p">(</span><span class="nx">roadGeometry</span><span class="p">,</span> <span class="nx">roadMaterial</span><span class="p">);</span>
                <span class="nx">road</span><span class="p">.</span><span class="nx">rotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
                <span class="nx">road</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="mf">0.1</span><span class="p">;</span>
                <span class="nx">road</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nx">z</span><span class="p">;</span>
                <span class="nx">city</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">road</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">city</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="kd">function</span> <span class="nf">animate</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">requestAnimationFrame</span><span class="p">(</span><span class="nx">animate</span><span class="p">);</span>

            <span class="c1">// Rotate camera around city</span>
            <span class="kd">const</span> <span class="nx">time</span> <span class="o">=</span> <span class="nb">Date</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.001</span><span class="p">;</span>
            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">time</span> <span class="o">*</span> <span class="mf">0.3</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
            <span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">time</span> <span class="o">*</span> <span class="mf">0.3</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
            <span class="nx">camera</span><span class="p">.</span><span class="nf">lookAt</span><span class="p">(</span><span class="nx">scene</span><span class="p">.</span><span class="nx">position</span><span class="p">);</span>

            <span class="c1">// Update day/night cycle</span>
            <span class="k">if</span><span class="p">(</span><span class="nx">dayCycle</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">renderer</span><span class="p">.</span><span class="nf">setClearColor</span><span class="p">(</span><span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Color</span><span class="p">().</span><span class="nf">setHSL</span><span class="p">(</span>
                    <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">time</span> <span class="o">*</span> <span class="mf">0.2</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.3</span>
                <span class="p">));</span>
            <span class="p">}</span>

            <span class="nx">renderer</span><span class="p">.</span><span class="nf">render</span><span class="p">(</span><span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="kd">function</span> <span class="nf">onWindowResize</span><span class="p">()</span> <span class="p">{</span>
            <span class="nx">camera</span><span class="p">.</span><span class="nx">aspect</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span> <span class="o">/</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">;</span>
            <span class="nx">camera</span><span class="p">.</span><span class="nf">updateProjectionMatrix</span><span class="p">();</span>
            <span class="nx">renderer</span><span class="p">.</span><span class="nf">setSize</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="kd">function</span> <span class="nf">toggleDayCycle</span><span class="p">()</span> <span class="p">{</span>
            <span class="nx">dayCycle</span> <span class="o">=</span> <span class="o">!</span><span class="nx">dayCycle</span><span class="p">;</span>
            <span class="nx">renderer</span><span class="p">.</span><span class="nf">setClearColor</span><span class="p">(</span><span class="nx">dayCycle</span> <span class="p">?</span> <span class="mh">0x87CEEB</span> <span class="p">:</span> <span class="mh">0x000000</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nf">init</span><span class="p">();</span>
        <span class="nf">animate</span><span class="p">();</span>
    <span class="nt"/>
<span class="nt"/>
<span class="nt"/>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>حالت تمام صفحه را وارد کنید
    

از حالت تمام صفحه خارج شوید

من فکر نمی کنم در اینجا باید دو فکر دوتایی وجود داشته باشد. کلود Deepseek R1 را از آب در اینجا بیرون می کشد.

خلاصه توانایی های برنامه نویسی

Claude 3.7 Sonnet در کد نویسی از Deepseek R1 مدل بهتری دارد. هم برای پایتون و هم برای سه کد ، کلود خیلی جلوتر از Deepseek R1 بود. این شگفت آور است ، با توجه به اینکه انسان شناسی به صراحت کلود را در کد نویسی بهتر کرده است.

نوشتن

من از هر دو مدل به طور گسترده استفاده کرده ام. کلود برای نوشتن حرفه ای ، به ویژه مطالب فنی بسیار بهتر است. Deepseek R1 به طرز عجیبی خلاق و انسانی تر است. هنگام نوشتن پایان نامه خود یا توضیح هر مفهوم فنی ، کلود می درخشد ، در حالی که اگر می خواهید با آنها صحبت کنید ، Deepseek R1 بهتر است.

حکم نهایی

• برای استدلال و ریاضیات ، کلود احساس ساختار و بالغ تر می کند.
• Deepseek R1 لحن حرفه ای کمتری دارد اما برای بیشتر کارهای دنیای واقعی کافی است.
• غزل Claude 3.7 در حال حاضر بهترین مدل برنامه نویسی است. این کد سریعتر ، بهتر و شفاف تر از سایر مدل ها می نویسد.
• کلود در نوشتن فنی بهتر است. با این حال ، Deepseek لحن و رویکرد انسانی تری دارد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا