მასტერკლასი "საშობაო ბურთები" დამზადებული ქაღალდისგან საკუთარი ხელით. ორი სამკუთხედის სფერო

სფერული სამკუთხედი და მისი გამოყენება.

სფერული სამკუთხედი- გეომეტრიული ფიგურა სფეროს ზედაპირზე, რომელიც ჩამოყალიბებულია სამი დიდი წრის გადაკვეთით. სფეროს ზედაპირზე სამი დიდი წრე, რომლებიც არ იკვეთება ერთ წერტილში, ქმნის რვა სფერულ სამკუთხედს. სფერულ სამკუთხედს, რომლის ყველა გვერდი დიდი წრის ნახევარზე ნაკლებია, ეწოდება ეილერი.

სფერული სამკუთხედის გვერდი იზომება მასზე დაფუძნებული ცენტრალური კუთხის მნიშვნელობით. სფერული სამკუთხედის კუთხე იზომება დიედრული კუთხის მნიშვნელობით იმ სიბრტყებს შორის, რომლებშიც მდებარეობს ამ კუთხის გვერდები. სფერული სამკუთხედების ელემენტებს შორის მიმართება შესწავლილია სფერული ტრიგონომეტრიით.

სფერული სამკუთხედის თვისებები:

  1. სიბრტყე სამკუთხედების ტოლობის სამი პირობის გარდა, სფერული სამკუთხედებისთვის მართებულია კიდევ ერთი: ორი სფერული სამკუთხედი ტოლია, თუ მათი შესაბამისი კუთხეები ტოლია.
  2. სფერული სამკუთხედის გვერდებზე მოქმედებს 3 სამკუთხედის უტოლობა: თითოეული გვერდი დანარჩენი ორი გვერდის ჯამზე ნაკლებია და მათ განსხვავებაზე დიდი.
  3. ყველა მხარის ჯამი a + b + c ყოველთვის ნაკლებია 2πR-ზე.
  4. რაოდენობას 2πR − (a + b + c) ეწოდება სფერული დეფექტი
  5. სფერული სამკუთხედის s = α + β + γ კუთხეების ჯამი ყოველთვის არის 3π-ზე ნაკლები და π-ზე მეტი.
  6. რაოდენობას ეწოდება სფერული ჭარბი ან სფერული ჭარბი
  7. სფერული სამკუთხედის ფართობი განისაზღვრება ფორმულით.
  8. ბრტყელი სამკუთხედისგან განსხვავებით, სფერულ სამკუთხედს შეიძლება ჰქონდეს ორი ან თუნდაც სამი 90°-იანი კუთხე.

ყველა სფერულ მრავალკუთხედს შორის ყველაზე საინტერესოა სფერული სამკუთხედი. სამი დიდი წრე, რომლებიც იკვეთება წყვილებში ორ წერტილში, ქმნის რვა სფერულ სამკუთხედს სფეროზე. ერთი მათგანის ელემენტების (გვერდებისა და კუთხეების) ცოდნით, შეგიძლიათ განსაზღვროთ ყველა დანარჩენის ელემენტები, ამიტომ განიხილეთ ურთიერთობა ერთ-ერთი მათგანის ელემენტებს შორის, რომელშიც ყველა მხარე დიდი წრის ნახევარზე ნაკლებია. სამკუთხედის გვერდები იზომება OABS სამკუთხედის ბრტყელი კუთხით, სამკუთხედის კუთხეები იზომება იმავე სამკუთხედის კუთხით, იხ.

სფერული სამკუთხედების თვისებები მრავალმხრივ განსხვავდება სიბრტყეში არსებული სამკუთხედების თვისებებისგან. ამრიგად, მართკუთხა სამკუთხედების ტოლობის ცნობილ სამ შემთხვევას ემატება მეოთხე: ორი სამკუთხედი ABC და A`B`C` ტოლია, თუ სამი კუთხე PA = RA`, PB = PB`, PC = PC. `შესაბამისად თანაბარია. ამრიგად, მსგავსი სამკუთხედები არ არსებობს სფეროზე; უფრო მეტიც, სფერულ გეომეტრიაში არ არსებობს თავად მსგავსების კონცეფცია, რადგან არ არსებობს ტრანსფორმაციები, რომლებიც ცვლის ყველა მანძილს ერთი და იგივე (არა ტოლი 1) რაოდენობის ჯერ. ეს ნიშნები დაკავშირებულია პარალელური ხაზების შესახებ ევკლიდეს აქსიომის დარღვევასთან და ასევე თანდაყოლილია ლობაჩევსკის გეომეტრიაში. სამკუთხედებს, რომლებსაც აქვთ თანაბარი ელემენტები და განსხვავებული ორიენტაცია, უწოდებენ სიმეტრიულებს, როგორიცაა, მაგალითად, სამკუთხედები AC`C და BCC`.

ნებისმიერი სფერული სამკუთხედის კუთხეების ჯამი ყოველთვის 180°-ზე მეტია. განსხვავება RA + RV + RS - p \u003d d (იზომება რადიანებში) - არის დადებითი მნიშვნელობა და ეწოდება მოცემული სფერული სამკუთხედის სფერულ სიჭარბეს. სფერული სამკუთხედის ფართობი: S = R2 d სადაც R არის სფეროს რადიუსი და d არის სფერული ჭარბი. ეს ფორმულა პირველად გამოაქვეყნა ჰოლანდიელმა ა.ჟირარმა 1629 წელს და დაარქვა მისი სახელი.

თუ განვიხილავთ დიაგონს a კუთხით, მაშინ 226 = 2p/n (n არის მთელი რიცხვი), სფერო შეიძლება დაიჭრას ასეთი დიგონის ზუსტად n ეგზემპლარად, ხოლო სფეროს ფართობი არის 4pR2 = 4p R = 1, ასე რომ, დიგონის ფართობი არის 4p/n = 2a. ეს ფორმულა ასევე მართალია a = 2pt/n-ისთვის და, შესაბამისად, ჭეშმარიტია ყველა a-სთვის. თუ გავაგრძელებთ ABC სფერული სამკუთხედის გვერდებს და გამოვხატავთ სფეროს ფართობს ამ შემთხვევაში წარმოქმნილი დიაგონების ფართობებით A, B, C კუთხით და საკუთარი ფართობით, მაშინ შეგვიძლია მივიდეთ ზემოაღნიშნულზე. ჟირარის ფორმულა.

სფერულ სამკუთხედში იგულისხმება სამკუთხედი სფეროს ზედაპირზე, რომელიც შედგება დიდი წრეების რკალებისგან - ანუ ისეთი წრეები, რომელთა ცენტრიც სფეროს ცენტრია. სფერული სამკუთხედის კუთხეები არის კუთხეები მის გვერდების ტანგენტებს შორის, რომლებიც შედგენილია მის წვეროებზე. რეგულარული სამკუთხედის კუთხეების მსგავსად, ისინი მერყეობს 0-დან 180°-მდე. ბრტყელი სამკუთხედისგან განსხვავებით, სფერულ სამკუთხედს არ აქვს 180°-ის ტოლი კუთხეების ჯამი, მაგრამ ამის გადამოწმება ადვილია, მაგალითად, სამკუთხედის გათვალისწინებით, რომელიც წარმოიქმნება ორი მერიდიანისა და ეკვატორის რკალებით გლობუსზე. : მიუხედავად იმისა, რომ მერიდიანები ერთმანეთს ემთხვევა პოლუსზე, ორივე მათგანი ეკვატორის პერპენდიკულარულია და ამ სამკუთხედს ორი მართი კუთხე აქვს!

სფერულ სამკუთხედს შეიძლება ჰქონდეს ორი მართი კუთხე

უკვე ინდური ვარაჰამიჰირა (V-VI სს.), არაბი მათემატიკოსები და ასტრონომები მე-9 საუკუნიდან. (Sabit ibn Korra, al-Battani), ხოლო დასავლელ მათემატიკოსებს შორის, დაწყებული Regiomontanus-დან (XV ს.), არსებობს მშვენიერი თეორემა სფერულ სამკუთხედებზე სხვადასხვა ფორმულირებებით. აი, როგორ შეიძლება ჩამოყალიბდეს თანამედროვე ნოტაციით:

cosa = cosbcosc + sinbsinccosA. სფერული კოსინუსების თეორემა ძალიან მნიშვნელოვანია როგორც ასტრონომიისთვის, ასევე გეოგრაფიისთვის. ეს თეორემა საშუალებას იძლევა გამოიყენოს ორი A და B ქალაქის კოორდინატები მათ შორის მანძილის დასადგენად. გარდა ამისა, სფერული კოსინუსების თეორემა დაეხმარა მათემატიკოსებს ისლამურ ქვეყნებში კიდევ ერთი პრაქტიკული პრობლემის გადაჭრაში: ქალაქში მოცემული კოორდინატებით იპოვეთ მიმართულება წმინდა ქალაქ მექასკენ (ყოველმა მართლმადიდებელმა მუსულმანმა დღეში ხუთჯერ უნდა ილოცოს მექას მიმართულებით). . ამ ამოცანის ამოხსნისას B ქალაქის მექად მიჩნევისას საჭირო იყო ამავე სამკუთხედის A კუთხის პოვნა.

გვერდი „ასტრონომიის მეცნიერების წესების კრებულიდან“, XI საუკუნე, ავტორი უცნობია.

ასტრონომიაში სფერული კოსინუსების თეორემა საშუალებას გაძლევთ გადახვიდეთ ერთი კოორდინატთა სისტემიდან ციურ სფეროზე მეორეზე. ყველაზე ხშირად გამოიყენება სამი ასეთი სისტემა: ერთში ციური ეკვატორი ეკვატორის ფუნქციას ასრულებს, ხოლო სამყაროს პოლუსები პოლუსებად, რომლის გარშემოც ხდება მნათობების ხილული ყოველდღიური ბრუნვა; მეორეს მხრივ, ეკვატორი არის ეკლიპტიკა - წრე, რომლის გასწვრივ ხდება მზის ხილული მოძრაობა ვარსკვლავების ფონზე წლის განმავლობაში; მესამეში ეკვატორის როლს ჰორიზონტი ასრულებს, პოლუსების როლს კი ზენიტი და ნადირ. კერძოდ, სფერული კოსინუსების თეორემის წყალობით, შესაძლებელია ჰორიზონტის ზემოთ მზის სიმაღლის გამოთვლა წელიწადის სხვადასხვა დროსა და სხვადასხვა დღეს.

არქიტექტურაში იალქნები არის სფერული სამკუთხედი, რომელიც უზრუნველყოფს გადასვლას კვადრატული გუმბათის სივრციდან გუმბათის გარშემოწერილობაზე. იალქანი, პანდატივი (ფრანგული pendentif-დან) - სარდაფის ნაწილი, გუმბათის სტრუქტურის ელემენტი, რომლის მეშვეობითაც ხდება მართკუთხა ძირიდან გუმბათის ჭერზე ან მის ბარაბანზე გადასვლა. იალქანს აქვს სფერული სამკუთხედის ფორმა, მწვერვალით ქვემოთ და ავსებს სივრცეს გუმბათოვანი კვადრატის მიმდებარე სვეტების დამაკავშირებელ წყაროს თაღებს შორის. აფრების სფერული სამკუთხედების ფუძეები ერთად ქმნიან წრეს და ანაწილებენ გუმბათის დატვირთვას თაღების პერიმეტრზე.

გუმბათი იალქნებზე აფრების მხატვრობა

ჯორჯ ნელსონი

"დიზაინერს შეუძლია დაისვენოს და გაერთოს; შედეგი შეიძლება იყოს ხუმრობა, გართობა. საოცარია, რამდენად ხშირად ეს არის ძალიან მნიშვნელოვანი გართობა." ჯორჯ ნელსონი

ჯორჯ ნელსონი არის ამერიკელი დიზაინერი, არქიტექტორი, კრიტიკოსი და დიზაინის თეორეტიკოსი. (1908, ჰარტფორდი, კონექტიკუტი - 1986, ნიუ-იორკი)

მან დააპროექტა განათების მოწყობილობები, საათები, ავეჯი, შეფუთვა და ეწეოდა საგამოფენო დიზაინს.

ჯორჯ ნელსონის ყველაზე ცნობილი დიზაინის პროექტები არის გეომეტრიული ფორმების ოსტატურად სტილიზაცია ოპ არტის ან გეომეტრიული აბსტრაქციონიზმის სულისკვეთებით.

დიზაინერი თავისი ცნობილი შავი სკამის ფორმას აგებს სფერული სამკუთხედის საფუძველზე, რომელიც ფართოდ გამოიყენებოდა გუმბათოვანი ნაგებობების არქიტექტურულ ნაგებობებში. კერძოდ, ბიზანტიურ და რუსულ ეკლესიებში ასეთ სფერულ სამკუთხედს „იალქანს“ უწოდებდნენ. "აფრების" წყალობით განხორციელდა გუმბათის საყრდენიდან გუმბათზე გლუვი გადასვლა.

ჯორჯ ნელსონი (ჯორჯ ჰაროლდ ნელსონი, 1908-1986)

ეშერის გრავიურა

კონცენტრული სფეროები.1935წ.ბოლო გრავიურა 24x24სმ.

ოთხი ღრუ კონცენტრული სფერო განათებულია ცენტრალური სინათლის წყაროთი. თითოეული სფერო შედგება ცხრა დიდი გადამკვეთი რგოლით ჩამოყალიბებული ბადისგან; ისინი ყოფენ სფერულ ზედაპირს 48 მსგავს სფერულ სამკუთხედად. Maurits Cornelis Escher (ჰოლ. Maurits Cornelis; დ. 17 ივნისი, 1898, ლეუვარდენი, ნიდერლანდები - გ. 27 მარტი, 1972, ლარენი, ნიდერლანდები) - ჰოლანდიელი გრაფიკოსი.

სფერული სამკუთხედის გამოყენება:

  1. სფერული სამკუთხედების გამოყენება 3D გრაფიკაში
  2. ასტრონომიაში
  3. გეოგრაფიაში. სფერული სამკუთხედის თეორემა საშუალებას გაძლევთ გამოიყენოთ ორი ქალაქის A და B კოორდინატები მათ შორის მანძილის დასადგენად.
  4. არქიტექტურაში
  5. სკამის დიზაინი ჯორჯ ნელსონის მიერ
  6. გრავირებაში

სფერული ტრიგონომეტრია

სფერული სამკუთხედები.ბურთის ზედაპირზე უმოკლეს მანძილი ორ წერტილს შორის იზომება დიდი წრის გარშემოწერილობის გასწვრივ, ანუ წრე, რომლის სიბრტყე გადის ბურთის ცენტრში. სფერული სამკუთხედის წვეროებიარის ბურთის ცენტრიდან და სფერული ზედაპირიდან გამომავალი სამი სხივის გადაკვეთის წერტილები. პარტიები , , სფერული სამკუთხედის არის ის კუთხეები სხივებს შორის, რომლებიც უფრო მცირეა (თუ რომელიმე კუთხე ტოლია, მაშინ სფერული სამკუთხედი გადაგვარდება დიდი წრის ნახევარწრედ). სამკუთხედის თითოეული მხარე შეესაბამება ბურთის ზედაპირზე დიდი წრის რკალს (იხ. სურათი).

კუთხეები , , Cსფერული სამკუთხედი მოპირდაპირე მხარეს , , შესაბამისად, განსაზღვრებით უფრო მცირეა ვიდრე , კუთხეები დიდი წრეების რკალებს შორის, რომლებიც შეესაბამება სამკუთხედის გვერდებს, ან ამ სხივებით განსაზღვრულ სიბრტყეებს შორის კუთხეებს.

სფერული ტრიგონომეტრიაეხება სფერული სამკუთხედების გვერდებსა და კუთხეებს შორის ურთიერთობის შესწავლას (მაგალითად, დედამიწის ზედაპირზე და ციურ სფეროზე). თუმცა, ფიზიკოსები და ინჟინრები ბევრ პრობლემაში ურჩევნიათ გამოიყენონ ბრუნვის გარდაქმნები, ვიდრე სფერული ტრიგონომეტრია.

სფერული სამკუთხედების თვისებები.სფერული სამკუთხედის თითოეული გვერდი და კუთხე, განსაზღვრებით, ნაკლებია.

ბურთის ზედაპირზე გეომეტრია არაევკლიდურია; ყველა სფერულ სამკუთხედში გვერდების ჯამი არის 0-ს შორის, კუთხეების ჯამი არის და შორის. ყველა სფერულ სამკუთხედში უფრო დიდი კუთხე მდებარეობს დიდი მხარის საპირისპიროდ. ნებისმიერი ორი გვერდის ჯამი მეტია, ვიდრე მესამე მხარე, ნებისმიერი ორი კუთხის ჯამი ნაკლებია, ვიდრე პლუს მესამე კუთხე.

სფერული სამკუთხედი და სფერული ტრიგონომეტრიის ძირითადი ფორმულები

ასტრონომიის მრავალი პრობლემა, რომელიც დაკავშირებულია ციური სხეულების აშკარა პოზიციებთან და მოძრაობასთან, მცირდება სფერული სამკუთხედების ამოხსნით.

სფერული სამკუთხედი არის ფიგურა ABC სფეროს ზედაპირზე, რომელიც ჩამოყალიბებულია სამი დიდი წრის რკალებით (ნახ. 15).

სფერული სამკუთხედის კუთხეები არის დიედრული კუთხეები დიდი წრეების სიბრტყეებს შორის, რომლებიც ქმნიან სფერული სამკუთხედის გვერდებს. ეს კუთხეები იზომება ბრტყელი კუთხეებით სამკუთხედის წვეროებზე მის გვერდებზე ტანგენსებს შორის.

ჩვეულებრივ განიხილება სამკუთხედები, რომელთა კუთხეები და გვერდები 180°-ზე ნაკლებია. ასეთი სფერული სამკუთხედებისთვის კუთხეების ჯამი ყოველთვის 180°-ზე მეტია, მაგრამ 540°-ზე ნაკლები, ხოლო გვერდების ჯამი ყოველთვის 360°-ზე ნაკლებია. სფერული სამკუთხედის სამი კუთხის ჯამს და 180°-ს შორის განსხვავებას ეწოდება სფერული ჭარბი σ, ე.ი.

σ = DA + DB + DC - 180°.

სფერული სამკუთხედის ფართობი s არის

სადაც R არის სფეროს რადიუსი, რომლის ზედაპირზეც წარმოიქმნება სამკუთხედი.

ამრიგად, სფერული სამკუთხედი თავისი თვისებებით განსხვავდება ბრტყელისაგან და შეუძლებელია მასზე ტრიგონომეტრიული ფორმულების გამოყენება სიბრტყეში.

აიღეთ სფერული სამკუთხედი ABC (ნახ. 15), რომელიც ჩამოყალიბებულია R რადიუსის სფეროზე და ცენტრით O წერტილში.

A წვეროდან ვხატავთ AD და AE ტანგენსებს b და c გვერდებზე, სანამ არ გადაიკვეთება OS და 0B რადიუსების გაფართოებებთან, რომლებიც დევს იმავე სიბრტყეში შესაბამის ტანგენსთან. D და E გადაკვეთის პირდაპირი წერტილების შეერთებით, ვიღებთ ორ ბრტყელ ირიბ სამკუთხედს ADE და ODE საერთო გვერდით DE. ამ სამკუთხედებზე ელემენტარული გეომეტრიის თეორემების გამოყენებით, ჩვენ ვწერთ:

DE 2 \u003d OD 2 + OE 2 - 2OD × OE × cos a,

DE 2 \u003d AD 2 + AE 2 - 2AD × AE × cos A.

მეორე განტოლების პირველს გამოკლებით მივიღებთ:

2OD × OE × cos a \u003d OD 2 - AD 2 + OE 2 - AE 2 + 2AD × AE × cos A. (1.31)

მართკუთხა ბრტყელი სამკუთხედებიდან OAE და OAD შემდეგია:

OD 2 -AD 2 =R 2 ;OE 2 -AE 2 =R 2 ;

AD = Rtg b ; AE = Rtg s;

ამ მიმართებების (1.31) ფორმულით ჩანაცვლებით და შესაბამისი შემცირებითა და გადარიცხვით, მივიღებთ

cos a \u003d cos b cos c + sin b sin c cosA, (1.32)

იმათ. სფერული სამკუთხედის გვერდის კოსინუსი ტოლია მისი სხვა ორი გვერდის კოსინუსების ნამრავლის პლუს იმავე გვერდების სინუსების ნამრავლისა და მათ შორის კუთხის კოსინუსების ნამრავლის.

ფორმულა (1.32) შეიძლება დაიწეროს სამკუთხედის ნებისმიერი გვერდისთვის. მოდით დავწეროთ, მაგალითად, b მხარისთვის:

cos b = cos cos-თან ერთად + sin with sin a cos B

და მასში cos a ჩანაცვლებით (1.32) ფორმულიდან მივიღებთ

cos b = cos c (cos b cos c + sin b sin c cos A) + sin c sin a cos B.

ფრჩხილების გაფართოება და მარჯვენა მხარის პირველი წევრის მარცხნივ გადატანა გვექნება:

cos b (1 - cos 2 s) \u003d sin b sin cos-ით cos A + sin c sin a cos B.

ჩანაცვლება (1 - cos 2 s) sin 2 s-ით და ყველაფრის შემცირება sin c-ით, საბოლოოდ მივიღებთ

sin a cos B \u003d sinc cos b - cos c sin b cos A, (1.33)

იმათ. გვერდის სინუსისა და ჩართული კუთხის კოსინუსის ნამრავლი ტოლია მეორე მხარის სინუსის ნამრავლის, რომელიც ესაზღვრება შემავალ კუთხეს მესამე გვერდის კოსინუსის გამოკლებით ჩართული გვერდის კოსინუსის ნამრავლს. კუთხე მესამე მხარის სინუსთან და პირველი გვერდის მოპირდაპირე კუთხის კოსინუსი.

ფორმულა (1.33) ეწოდება ხუთი ელემენტის ფორმულას. ის შეიძლება დაიწეროს სინა a cos C-ის, sin b cos A, sin b cos C, sin cos A-ს და sin cos B-ის პროდუქტების ანალოგიით.

ახლა ჩვენ ვხსნით თანასწორობას (1.32) cos A-სთან მიმართებაში:

ბოლო ტოლობის ორივე მხარის კვადრატში და 1-ს გამოკლებით მივიღებთ:

ფრჩხილების გახსნა და ამ გამონათქვამის ორივე ნაწილის გაყოფა sin 2 a-ზე, მივიღებთ

მიღებული გამონათქვამი სრულყოფილად სიმეტრიულია a, b და c მიმართ, და A-ს B-ით და b-ით ან A-ით C-ით და a c-ით ჩანაცვლებით, ჩვენ ვწერთ.

იმათ. სფერული სამკუთხედის გვერდების სინუსები პროპორციულია მათი საპირისპირო კუთხის სინუსების; ან სფერული სამკუთხედის გვერდის სინუსის შეფარდება მოპირდაპირე კუთხის სინუსთან არის მუდმივი.

სამი წარმოებული მიმართება (1.32), (1.33), (1.34) სფერული სამკუთხედის გვერდებსა და კუთხეებს შორის მთავარია; მათგან სფერული ტრიგონომეტრიის მრავალი სხვა ფორმულა შეიძლება იყოს მიღებული. ჩვენ შემოვიფარგლებით მართკუთხა სფერული სამკუთხედის მხოლოდ ერთი ფორმულის გამოყვანით. მოდით A = 90°; შემდეგ sin A \u003d 1, cos A \u003d 0 და ფორმულიდან (1.33) ვიღებთ

sin a cos B \u003d sin cos b.

ამ ტოლობის ორივე ნაწილის გაყოფა sin b-ზე და ჩანაცვლება, (1.34) მიხედვით, გვექნება:

ctg B = sin c ctg b

იმათ. მართკუთხა სფერული სამკუთხედის ერთი ფეხის ტანგენტის თანაფარდობა მოპირდაპირე კუთხის ტანგენტს უდრის მეორე ფეხის სინუსს.

კომპიუტერში გაუსის სფეროზე გამოსახულების შესახებ ინფორმაციის წარმოსაჩენად, აზრი აქვს მისი ზედაპირის უჯრედებად დაყოფას.

ამ შემთხვევაში, თავდაპირველი ზედაპირის იმ ნაწილის ფართობი, რომელიც ორიენტირებულია დანაყოფის უჯრედით განსაზღვრული მიმართულებების კონუსის შიგნით, ასოცირდება თითოეულ უჯრედთან. გაფართოებული სფერული გამოსახულების ასეთ დისკრეტულ მიახლოებას ორიენტაციის ჰისტოგრამა ეწოდება. იდეალურ შემთხვევაში, უჯრედები უნდა აკმაყოფილებდეს შემდეგ მოთხოვნებს:

აქვს იგივე ფართობი;

იყავი იგივე ფორმის

იყავით რეგულარულად ერთმანეთისგან;

აქვს მომრგვალებული ფორმა;

დანაყოფი უნდა უზრუნველყოს საკმარისად კარგი კუთხოვანი გარჩევადობა;

უნდა არსებობდეს ბრუნვები, რომლებიც დანაყოფი თავისთავად მიიღებენ.

წაგრძელებული უჯრედები უნდა გამოირიცხოს, რადგან ისინი შეესაბამებიან ინფორმაციას ზედაპირის არეების შესახებ, რომელთა ორიენტაცია უფრო მეტად იცვლება, ვიდრე იმავე უბნის უფრო მომრგვალებული უჯრედების შემთხვევაში. ამავდროულად, თუ უჯრედები რეგულარულად არის მოწყობილი, მაშინ მათი მდებარეობა მეზობლებთან მიმართებაში ერთნაირი იქნება ყველა უჯრედისთვის და ასეთი კონფიგურაციები ძალიან სასურველია. სამწუხაროდ, შეუძლებელია ყველა ამ მოთხოვნის ერთდროულად დაკმაყოფილება.

ერთ-ერთი შესაძლო დანაყოფი წარმოიქმნება გრძივი სარტყლებით, რომელთაგან თითოეული შემდეგ იყოფა მერიდიალური ზოლებით (სურ. 16.13). შედეგად მიღებული უჯრედები შეიძლება იყოს თითქმის თანაბარი ფართობით, თუ შემცირდება ასეთი ზოლების რაოდენობა მაღალ განედებზე. ასეთი სქემის ერთ-ერთი უპირატესობა არის უჯრედის პოვნის სიმარტივე, რომელსაც ზედაპირზე გარკვეული ნორმა უნდა მივანიჭოთ. თუმცა, ასეთი მეთოდი ძალიან შორს არის ზემოთ ჩამოთვლილი მოთხოვნების დაკმაყოფილებისგან. მაგალითად, არ არსებობს ბრუნვები, რომელთა დახმარებითაც სფეროს აგებული დანაყოფი ითარგმნება საკუთარ თავში (გარდა პოლუსების დამაკავშირებელი ღერძის გარშემო ბრუნებისა).

უფრო შესაფერისი ტიხრების მიღება შესაძლებელია ერთეული სფეროს რეგულარულ პოლიედრებზე პროექციით, რომლის ცენტრები ემთხვევა სფეროს ცენტრს. რეგულარული მრავალკუთხედის სახეები არის რეგულარული მრავალკუთხედები (და ისინი ყველა ერთნაირია). მაშასადამე, რეგულარული პოლიედრონის პროექციის შედეგად მიღებულ დანაყოფს აქვს ის თვისება, რომ ყველა უჯრედს ჰქონდეს იგივე ფორმა და ფართობი. გარდა ამისა, ყველა უჯრედის გეომეტრიული განლაგება მეზობლების მიმართ ერთნაირია. სამწუხაროდ,

ბრინჯი. 16.13. სფეროს ელემენტებად დაყოფა მერიდიანებითა და პარალელებით. სამწუხაროდ, ასეთ დანაყოფს აქვს მხოლოდ რამდენიმე თვისება, რომელიც საჭიროა ორიენტაციის ჰისტოგრამის შესანახად.

ბრინჯი. 16.14. (იხ. სკანირება) დოდეკაედრონისა და იკოსაედრონის პროექცია ერთ სფეროზე დანაყოფის მისაღებად უჯრედებში.

ცნობილია მხოლოდ ხუთი რეგულარული სხეული, საიდანაც უნდა აირჩიო (ტეტრაედონი, ჰექსაედონი, ოქტაედრონი, დოდეკედრონი და იკოსაედონი). დოდეკაედრისთვის უჯრედები საკმაოდ მომრგვალებულია (სურ. 16.14, ა). თუმცა დოდეკაედრონს მხოლოდ თორმეტი სახე აქვს. იკოსედრონიც კი იძლევა ორიენტაციის ძალიან უხეში წარმოდგენას (სურათი 16.14b). გარდა ამისა, მისი ოცი უჯრედი არც თუ ისე მომრგვალებულია.

შეგვიძლია უფრო შორს წავიდეთ და განვიხილოთ ნახევრადრეგულარული პოლიედრები. მათი სახეები ასევე რეგულარული მრავალკუთხედია, მაგრამ არა აუცილებლად იგივე. ყველა სახის ფართობი არ არის თანაბარი. ზოგიერთ შემთხვევაში, შესაძლებელია ახალი პოლიედრონის აგება, რომელსაც აქვს სახეებს შორის კავშირების იგივე ტოპოლოგია, როგორც თავდაპირველი ნახევრადრეგულარული პოლიედონი, მაგრამ მისი სახის ფართობები ტოლია. სადაც

ბრინჯი. 16.15. ა - ჩამოჭრილი იკოსაედონი, რომელიც წარმოადგენს ნახევრადრეგულარულ პოლიედრონს 32 სახის მქონე; ბ - პენტადან დეკაედრონამდე, რომელიც შედგება 60 სამკუთხა სახისგან. ერთეული სფეროს ზედაპირის უფრო მცირე დანაყოფები შეიძლება დაფუძნდეს ასეთ ნახევრადრეგულარულ პოლიედრებზე.

ბრინჯი. 16.16. გეოდეზიური ქსელების აგების შესაძლებლობა რეგულარული ან ნახევრადრეგულარული პოლიედრების რომელიმე პროექციის საფუძველზე.

თითოეული სახე იყოფა სამკუთხა უჯრედებად. აქ ნაჩვენები ქსელი ეფუძნება იკოსაედრონს და აქვს 12 წვერო, რომლებიც 5 უჯრედის მიმდებარედ არიან. ექვსი უჯრედი იყრის თავს დარჩენილ წვეროებზე.

ზოგიერთი სახის ფორმა აღარ არის სწორი. ნახევრადრეგულარული პოლიედრონზე დაფუძნებული დანაყოფის მაგალითი იძლევა ფეხბურთის ბურთს (სურ. 16.15, ა). თავდაპირველად აღებულია დამსხვრეული იკოსაედონი, ანუ სხეული 12 ხუთკუთხა და 20 ექვსკუთხა სახეებით. სამწუხაროდ, არსებობს მხოლოდ 13 ნახევრადრეგულარული პოლიედრები (ხუთი დამსხვრეული რეგულარული პოლიედრები, კუბოქტაედონი, იკოსიდოდეკაედონი, კუბო კუბი, კუბოკტაედონი, კუბოკტაედონი, რომბიკუბოკტაედონი, ჩამოსხმული იკოსიდოდეკაედონი). ისინი არ იწვევს ჩვენი მიზნებისთვის საკმარისად მცირე დანაყოფებს.

თუ ჩვენ მაინც გვინდა მივიღოთ უფრო თხელი დანაყოფი, მაშინ შეგვიძლია ვცადოთ არსებულის დაშლა სამკუთხა ელემენტებად. მაგალითად, თუ თორმეტკუთხედის თითოეულ ხუთკუთხედს დავყოფთ ხუთ თანაბარ სამკუთხედად, მივიღებთ ხუთკუთხედს 60 გვერდით (სურ. 16.15, ბ). Ohm არის ორმაგი შეკვეცილი იკოსაედონი.

ერთი და იგივე მიმართულებით, ყოველი მიღებული სამკუთხედი შეიძლება დაიყოს ოთხ პატარა სამკუთხედად, გეოდეზიაში კარგად ცნობილი გუმბათოვანი სტრუქტურების სრული შესაბამისად (ნახ. 16.16). ზოგიერთი ზემოაღნიშნული მოთხოვნების შემსუბუქებით, შესაძლებელია მაღალი გარჩევადობის მიღწევა. ფაქტობრივად, უმჯობესია გამოიყენოთ ორმაგი კონსტრუქციები, რადგან მათი სახეები უმეტესად (არარეგულარული) ექვსკუთხედებია, მათ შორის მიმოფანტული 12 ხუთკუთხედი (სურ. 16.15, ბ). ამ გზით შესაძლებელია თვითნებურად მცირე ტიხრების უზრუნველყოფა.

ამ მიდგომის გამოსაყენებლად საჭიროა ეფექტურად განვსაზღვროთ ელემენტი, რომელიც შეესაბამება ზედაპირის მოცემულ ნორმას. რეგულარული პოლიტოპების საფუძველზე მიღებული ტიხრების შემთხვევაში, ადვილია გამოთვალოთ კუთხეების კოსინუსები მოცემულ ერთეულ ვექტორსა და უჯრედის ცენტრების შესაბამის ვექტორებს შორის. (ეს უკანასკნელი შეესაბამება დუალის წვეროებს

რეგულარული პოლიედონი.) შემდეგ მოცემული ვექტორი ენიჭება უჯრედს, რომლის ცენტრიც ყველაზე ახლოსაა. გეოდეზიური ქსელის მსგავსი დანაყოფის შემთხვევაში შესაძლებელია იერარქიული გზით მოქმედება. ასეთი დანაყოფი ეფუძნება ზოგიერთ რეგულარულ პოლიედრონს. უჯრედი უახლოესი ცენტრით არის ნაპოვნი როგორც ზემოთ აღწერილი. ამის შემდეგ ჩვენ განვსაზღვრავთ სამკუთხედებიდან რომელ ნაწილს ყოფს მას, ერთეული ნორმალური ვექტორი მოხვდება. ეს პროცესი გრძელდება შემდეგი ოთხი სამკუთხედისთვის, რომლებიც ყოფენ აღმოჩენილ სამკუთხედს და ა.შ. პრაქტიკაში შეიძლება გამოყენებულ იქნას ცხრილების მოძიების მეთოდები, რომლებიც, თუმცა ზუსტი არ არის, მაგრამ ძალიან სწრაფია.

დაე, სფეროზე ერთი უჯრედით შევსებული მყარი კუთხე იყოს (იკოსედრონის შემთხვევაში). ამოზნექილი ობიექტისთვის ასეთ უჯრედში მოხვედრილი ნორმათა მოსალოდნელი რაოდენობა არის

ნათელია, რომ ორიენტაციის ჰისტოგრამა, ანუ გაფართოებული სფერული გამოსახულების დისკრეტული მიახლოება, შეიძლება გამოითვალოს ადგილობრივად. ჩვენ უბრალოდ ვითვლით ნორმალების რაოდენობას, რომლებიც ეკუთვნის თითოეულ უჯრედს. ამავდროულად, გაუსის გამრუდება გამოიხატება ზედაპირის განმსაზღვრელი ფუნქციის პირველი და მეორე ნაწილობრივი წარმოებულებით. პრაქტიკაში, ამ წარმოებულების შეფასებები არასანდო აღმოჩნდება ხმაურის არსებობის გამო. აქედან გამომდინარე, ძალიან მნიშვნელოვანია ის ფაქტი, რომ გაფართოებული სფერული გამოსახულება შეიძლება გამოითვალოს წარმოებულების გამოთვლის გარეშე.

ამ დემოს სიუჟეტი ასეთია: ერთხელ ჩემმა მეგობარმა შექმნა პლანეტის რუქების გენერატორი თავისი თამაშისთვის და სურდა, რომ ამ გზით შექმნილი რუკები მბრუნავი სფეროს სახით ეჩვენებინათ. თუმცა, ამავდროულად, მას არ სურდა სამგანზომილებიანი გრაფიკის გამოყენება, სამაგიეროდ შექმნა მრავალი ჩარჩო იმავე სფეროთი, რომელიც ბრუნავდა სხვადასხვა კუთხით. გამოყენებული მეხსიერების რაოდენობა იყო... ვთქვათ, გადაჭარბებული, მაგრამ კადრების წარმოქმნის სიჩქარე (ისევე როგორც მათი შესრულების ხარისხი) ძალიან დაზარალდა. ცოტა ფიქრის შემდეგ მოვახერხე და დავეხმარო მას ამ პროცესის ოპტიმიზაციაში, მაგრამ ზოგადად მე მქონდა სამართლიანი განცდა, რომ ეს იყო ამოცანა OpenGL-სთვის და არა 2D გრაფიკისთვის.

და აი, ერთ დღეს, როცა უძილობა მტანჯავდა, გადავწყვიტე ამ ორი მიდგომის გაერთიანება: OpenGL-ის საშუალებით დამეხატა მბრუნავი სფერო (მასზე გადაჭიმული პლანეტის რუქით), მაგრამ ამავდროულად დამეტოვებინა ბრტყელი.

და უნდა ვთქვა, რომ წარმატებას მივაღწიე. მაგრამ პირველ რიგში.

პროცესის მათემატიკა

დასაწყისისთვის, მოდით განვსაზღვროთ რეალური ამოცანა. ეკრანის თითოეული წერტილისთვის, ჩვენ გვაქვს ორი ეკრანის კოორდინატი დეკარტის კოორდინატთა სისტემაში და უნდა ვიპოვოთ მისთვის სფერული კოორდინატები (ფაქტობრივად, გრძედი და განედი), რომლებიც, ფაქტობრივად, არის პლანეტის რუქის ტექსტურის კოორდინატები.

Ისე. სფერული კოორდინატთა სისტემიდან დეკარტისეულზე გადასვლა მოცემულია განტოლებათა სისტემით (აღებულია ვიკიპედიიდან):

და საპირისპირო გადასვლა - ასეთი განტოლებით:

კოორდინაცია ჩვენ შეგვიძლია ადვილად გავიდეთ Xდა რადიუსის ცოდნა და ჩვენ შეგვიძლია თავად ავიღოთ რადიუსი ერთის ტოლი.
მომავალში, ჩვენ შევთანხმდებით, რომ ოდნავ შევცვლით ზემოთ მოცემულ განტოლებებს ცნებების ურთიერთგაცვლით (ჩვენთვის ეს იქნება ეკრანის ვერტიკალური) და (ეს იქნება სცენის სიღრმე).

ტექნიკური ნაწილი

იდეის განსახორციელებლად დაგვჭირდება Quad-ის გამოყენება (უკვე ვსაუბრობ მის გამოყენებაზე, ამიტომ არ გავიმეორო, მით უმეტეს, რომ ქვემოთ მოცემულია პროექტის სრული კოდის ბმული), ასევე ორი. ტექსტურები: პლანეტის რეალური რუკა (მე გამოვიყენე დედამიწის ტექსტურა 2048x1024 ) და ტექსტურის კოორდინატთა რუქები. მეორე ტექსტურის გენერირების კოდი კარგად იმეორებს დეკარტისეულიდან სფერულ კოორდინატებზე გადაყვანის მათემატიკას:

int texSize = 1024; ორმაგი r = texSize * 0.5; int pixels = ახალი int; for (int row = 0, idx = 0; row< texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x<= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }
გაითვალისწინეთ, რომ კოორდინატები Xდა დიაპაზონიდან გადადის [-1..1] დიაპაზონში და ტექსტურის კოორდინატები Uდა გარდაიქმნება რადიანებიდან დიაპაზონში, რის შემდეგაც ისინი იწერება 32-ბიტიანი ტექსტურის წითელ და მწვანე კომპონენტებზე, შესაბამისად. ალფა არხი გამოიყენება "სიღრმის" შესანახად (კოორდინატები ), ხოლო ლურჯი ამ დროისთვის გამოუყენებელი რჩება. ორმხრივი ფილტრაციის გამორთვა ასევე არ არის შემთხვევითი: ამ ეტაპზე ის არანაირ ეფექტს არ იძლევა (მეზობელ წერტილებს ნებისმიერ შემთხვევაში აქვთ იგივე მნიშვნელობები, საკმაოდ მკვეთრი ნახტომებით) და რისი ჩვენებასაც ვაპირებ, ეს საზიანო იქნება. მაგრამ უფრო მეტი ამის შესახებ ქვემოთ.

ორივე ტექსტურა იკვებება მარტივი პიქსელის შაიდერის შეყვანით (შემდგომში, სურათებზე დაწკაპუნება შესაძლებელია):

Private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "variing vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol, (vTex.w >
მე არ ვაძლევ სცენის გადაცემის კოდს, რადგან მასში ყველაფერი საკმაოდ ტრივიალურია (და, კიდევ ერთხელ, შეგიძლიათ იხილოთ იგი სრულ წყაროში), ხოლო თავად შაიდერი საკმაოდ პრიმიტიულია. ყველაზე საინტერესო, ალბათ, ის არის, რომ ალფა არხი ჯერჯერობით მხოლოდ პოზიტიურზეა შემოწმებული, მაშინ როცა ის შეიძლება გამოყენებულ იქნას განათების ეფექტისთვის.

საკმაოდ კარგი აღმოჩნდა, მაგრამ რაღაცნაირად ბრტყელი, პლუს მე მინდა დავამატო პლანეტის რეალური ბრუნვა მისი ღერძის გარშემო.

შადერში ჩავრთავთ კიდევ ერთ პარამეტრს (მას შევცვლით დიაპაზონში დროის მიხედვით), პლუს ვამატებთ "სიღრმეს" (ფერს ვამრავლებთ ალფა არხიდან მნიშვნელობით):

Private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "variing vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vTex.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy ).rgb;\n" + "gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
ისე, არ არის პრეტენზია თავად სფეროზე, მაგრამ სურათი რატომღაც გამოიყურება ... რვა ბიტიანი, ან რაღაც. და გასაკვირი არ არის: ჩვენ ჩავწერეთ ტექსტურის კოორდინატები დიაპაზონში (მაქსიმუმი, რაც ჩვენთვის ხელმისაწვდომია ჩვეულებრივი ფერის კომპონენტებში), რაც ნიშნავს, რომ ჩვენს ტექსტურას შეიძლება ჰქონდეს არაუმეტეს 256 ქულა სიმაღლეში (და 512 სიგანეში, ბრუნვის გათვალისწინებით). საკმარისი არ არის, საჭიროა მინიმუმ 10-ბიტიანი სიზუსტე.

გარჩევადობის გაზრდა

მაშინვე გაფრთხილებთ: აქ აღწერილი კოდი შეიძლება არასწორად იმუშაოს ნებისმიერ მოწყობილობაზე, თუმცა მე მოვახერხე ნორმალური რენდერის მიღწევა ყველა მოწყობილობაზე, რომელიც ხელში მეჭირა. ნებისმიერ შემთხვევაში, რაც აქ არის აღწერილი, ჩვეულებრივი ჰაკია.

ასე რომ, ჩვენ აქამდე გამოვიყენეთ სამი ფერის კომპონენტიდან ორი, ე.ი. 16 ბიტი 24-დან. კარგი, მოდით შევკრიფოთ მონაცემები ისე, რომ ტექსტურის თითოეულ კოორდინატს ჰქონდეს 12 ბიტი ზომა, რაც მოგვცემს 4096 პიქსელამდე სიმაღლის ტექსტურებთან მუშაობის საშუალებას! ამისათვის ჩვენ შევცვლით პროგრამაში სიტყვასიტყვით სამ ხაზს:

Long v = Math.round(4095 * theta / Math.PI); ...u = Math.round(4095 * phi / (2 * Math.PI)); ... პიქსელები = (ინტ) ((ა<< 24) + (v << 12) + ((u & 15) << 8) + (u >> 4)); ...
და დაწერეთ ახალი შაიდერი, რომელიც ითვალისწინებს 12-ბიტიანი მისამართების სქემას (ეს ის ადგილია, სადაც ორმხრივი ფილტრაცია უნდა იყოს გამორთული!):

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "variing vec4 TexCoord0;\n" + "void main() (\n" + "vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + "vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = სართული (vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0 + uOffset,\n" + " (vOff.z * 16.0 + hiY) / 4095.0);\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + "gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0: 0.0));\n" + ")\n";
ხო, ეს სულ სხვა საქმეა! მცირე ცვლილებებით (დამატებით პინჩის მასშტაბირება და თითის როტაცია), მე ვაჩვენე ეს პროგრამა ჩემს მეგობრებს და კოლეგებს და ამავე დროს ვკითხე, რამდენი სამკუთხედი იყო მათი აზრით ამ სცენაზე. შედეგები იცვლებოდა და თავად კითხვამ გააჩინა ეჭვი დაჭერის არსებობის შესახებ (ამ შემთხვევაში რესპონდენტებმა ხუმრობდნენ „ერთი“, რაც არც თუ ისე შორს იყო სიმართლისგან), მაგრამ სწორი პასუხი მუდმივად გასაკვირი იყო. და ყველამ, როგორც ერთმა, იკითხა: რატომ შეიძლება სფეროს ბრუნვა ერთი ღერძის გარშემო, მაგრამ არა დახრილი? .. ჰმ.

დახრილობა

მაგრამ ფაქტია, რომ ამ სქემაში დახრილობა ბევრად უფრო რთული განსახორციელებელია. ფაქტობრივად, ამოცანა არ არის გადაუჭრელი და მე კი გავუმკლავდი მას, მაგრამ არა ნიუანსების გარეშე.

არსებითად, ამოცანა მოდის გადატანილი კოორდინატის აღებაზე , ხოლო კოორდინატი Uარ იცვლება: ეს იმიტომ ხდება, რომ ჩვენ ვამატებთ ბრუნვას ღერძის გარშემო X. გეგმა ასეთია: ტექსტურის კოორდინატებს ვაქცევთ ეკრანის კოორდინატებად (დიაპაზონში [-1..1]), ვაყენებთ მათ ბრუნვის მატრიცას ჰორიზონტალური ღერძის გარშემო (ამისთვის წინასწარ ვწერთ ახალ მუდმივში. uTiltდახრილობის კუთხის სინუსი და კოსინუსი), შემდეგ კი ვიყენებთ ახალ კოორდინატს ნიმუში ჩვენს შაბლონის ტექსტურაში. „მოტრიალებული“ კოორდინატი ის ასევე გამოგვადგება, მისი დახმარებით ჩვენ ასახავს გრძედი ბურთის უკანა მხარეს). ეკრანის კოორდინატი თქვენ მოგიწევთ მკაფიოდ გამოთვლა, რათა არ გააკეთოთ ორი ტექსტურის შერჩევა ერთი ტექსტურიდან, ამავდროულად ეს გაზრდის მის სიზუსტეს.

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "uniform vec2 uTilt;\n" + "variing vec4 TexCoord0;\n" + "void main() (\n" + " float sx = 2.0 * TexCoord0.x - 1.0;\n" + " float sy = 2.0 * TexCoord0.y - 1.0;\n" + " float z2 = 1.0 - sx * sx - sy * sy;\n" + " if (z2 > 0.0) (;\n" + " float sz = sqrt(z2);\n" + " float y = ( sy * uTilt.y - sz * uTilt.x + 1.0) * 0.5;\n" + " float z = (sy * uTilt.x + sz * uTilt.y);\n" + " vec4 vTex = texture2D(uTexture0 , vec2 (TexCoord0.x, y));\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = სართული (vOff.y / 16.0) ;\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0,\n" + " ( vOff.z * 16.0 + hiY) / 4095.0);\n" + " თუ (z< 0.0) { vCoord.x = 1.0 - vCoord.x; }\n" + " vCoord.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * sz, 1.0);\n" + " } else {\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" + " }\n" + "}\n";
ჰოოი, ფერდობზე მუშაობდა! ეს უბრალოდ უცნაური ხმაურია ნახევარსფეროების საზღვარზე, ცოტა უხერხული. ცხადია, პრობლემა მდგომარეობს სასაზღვრო წერტილებში მიმართვის არასაკმარისი სიზუსტით (თვით წრეზე წერტილები შეესაბამება კოორდინატების ძალიან დიდ დიაპაზონს, ერთი ტექსელი ვრცელდება საკმაოდ შესამჩნევი სიგრძის ინტერვალზე). საბოლოოდ, მე მოვახერხე ამის დამარცხება ერთის ნაცვლად ორი გენერირებული ტექსტურის გამოყენებით.

შედეგად, შეგიძლიათ გაადიდოთ და დაატრიალოთ ბურთი ისევე, როგორც Google Earth-ში. იმ განსხვავებით, რომ მხოლოდ ორი სამკუთხედია.

და ბოლოს, დაპირება. პროექტის წყაროს კოდი ხელმისაწვდომია მისამართზე